当我使用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]
实例(.Kind
Local
(。
要以毫秒为单位格式化它,您需要使用带有显式格式字符串的.ToString()
,如 LotPings的答案所示。