将纪元时间转换为本地时区(带微秒)

Converting epochtime to localtime zone(with Microseconds)

当我使用 Get-EpochDate 时,时间仅以秒显示(2019 年 8 月 15 日,星期四 4:07:09 下午)。下面是我正在使用的代码

Function Get-EpochDate ($epochDate) { [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddMilliSeconds($epochDate)) }

 get-EpochDate 1565899629580 / 1000000

我希望它是:

Thursday, August 15, 2019 4:07:09.580 PM

默认格式不输出毫秒,即使它们在那里。

请记住,内部 [datetime] 表示和输出格式是不同的东西。

应用格式后,它不再是日期时间而是字符串。

由于我的locale/CultureInfo不支持AM/PM,我必须在这里明确说明:

$CIUS = New-Object System.Globalization.CultureInfo en-US
(Get-EpochDate 1565899629580).ToString('dddd, MMMM dd, yyyy h:mm:ss.fff tt zzzz', $CIUS)

我添加了时区以显示我在此处获得的输出中的偏移量:

Thursday, August 15, 2019 10:07:09.580 PM +02:00

补充

get-EpochDate 1565899629580 / 1000000

没有达到您的预期(即使恰好给出了正确的结果);它实际上等同于:

get-EpochDate 1565899629580

也就是说,/1000000 作为 单独的参数传递 并且 - 因为您的函数仅声明 一个 参数 - 被 忽略 .

如果你真的想将表达式 1565899629580 / 1000000的结果传递给get-EpochDate,你必须将它包含在中括号 ((...)):

get-EpochDate (1565899629580 / 1000000)

相比之下,如果您想对 get-EpochDate 调用的 结果 执行除法,请将调用放在括号中,但请注意,这不会由于涉及的数据类型,不适用于您的特定情况:

# Correct syntax, but since get-EpochData returns a [datetime] instance,
# you cannot directly apply division (/) to it.
(get-EpochDate 1565899629580) / 1000000

如果您将函数声明为 advanced (cmdlet-like) function,您可能会遇到忽略参数的问题,因为如果传递了意外参数,此类函数会报告错误;此外,高级功能可以将参数标记为 mandatory.

此外,您可以将 [timezone]::CurrentTimeZone.ToLocalTime([datetime]'1/1/1970') 简化为 [datetime] '1970-01-01Z'

以下定义显示了两种改进:

Function Get-EpochDate {
  [CmdletBinding()] # Make the function advanced so that it only accepts declared parameters.
  param(
    [Parameter(Mandatory)] # Mark the parameter as mandatory.
    [long] $epochDateMs
  )
  ([datetime] '1970-01-01Z').AddMilliSeconds($epochDateMs)
}

该函数输出一个本地 [datetime] 实例(.KindLocal)。

要将其格式化为毫秒,您需要使用 .ToString() 和明确的格式字符串,如 LotPings 的答案所示。