将纪元时间转换为本地时区(带微秒)
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]
实例(.Kind
是 Local
)。
要将其格式化为毫秒,您需要使用 .ToString()
和明确的格式字符串,如 LotPings 的答案所示。
当我使用 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]
实例(.Kind
是 Local
)。
要将其格式化为毫秒,您需要使用 .ToString()
和明确的格式字符串,如 LotPings 的答案所示。