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



当我使用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] 表示形式和输出格式是不同的东西。

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

由于我的区域设置/文化信息不支持 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

为了补充LotPings的有用答案:

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

如果已将函数声明为高级(类似 cmdlet(函数,则可能会发现忽略参数的问题,因为如果传递意外参数,此类函数会报告错误;此外,高级函数可以将参数标记为必需参数。

此外,您可以将[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的答案所示。

最新更新