在PowerShell中获取Unix时间戳秒数的最惯用方法是什么?
首先咱们拆解你遇到的问题:你用[datetimeoffset]得到的结果和Get-Date不同,核心原因是两者对时区的默认处理逻辑不一样。当你执行([datetimeoffset] '2020-01-01')时,PowerShell会根据系统本地时区解析这个日期,ToUnixTimeSeconds()返回的是该本地时间对应的UTC时间戳;而Get-Date -Date '2020-01-01' -UFormat %s中,-Date默认解析为本地时间,%s计算的是从1970-01-01 UTC到这个本地时间的UTC等效时间的秒数。接下来咱们聊聊符合PowerShell惯用风格的解决方案:
一、用Get系列命令获取UTC日期的方法
1. 获取当前UTC时间
直接使用-Utc参数即可:
Get-Date -Utc
输出示例:Wednesday, October 11, 2023 2:30:00 PM(标准UTC时间)
2. 将本地时间转换为UTC
先获取目标本地时间,再调用ToUniversalTime()方法转换:
# 将指定本地日期转为UTC (Get-Date -Date '2020-01-01').ToUniversalTime() # 将当前本地时间转为UTC (Get-Date).ToUniversalTime()
3. 直接解析UTC格式的日期字符串
如果你的日期字符串带UTC标识(末尾加Z),Get-Date会直接解析为UTC时间:
Get-Date -Date '2020-01-01Z'
二、PowerShell中获取Unix时间戳秒数的惯用方式
要获取准确的UTC Unix时间戳,推荐以下几种贴合PowerShell风格的方法:
1. 用Get-Date结合-UFormat %s(最直接)
%s是专门返回Unix时间戳的格式符(带小数精度),配合-Utc参数确保基于UTC计算:
# 获取当前UTC时间的Unix秒数(带小数) Get-Date -Utc -UFormat %s # 获取指定UTC日期的Unix秒数 Get-Date -Date '2020-01-01Z' -UFormat %s # 将本地日期转为UTC后获取Unix秒数 (Get-Date -Date '2020-01-01').ToUniversalTime() | Get-Date -UFormat %s
如果需要整数秒数,直接做类型转换即可:
[int64](Get-Date -Utc -UFormat %s)
2. 通过时间差计算(更灵活)
利用[datetime]::UnixEpoch(1970-01-01 UTC)和目标UTC时间的差值计算,这种方式能灵活调整精度(比如毫秒、分钟等):
# 获取当前UTC时间的Unix秒数(整数) [int64]((Get-Date -Utc) - [datetime]::UnixEpoch).TotalSeconds # 获取指定UTC日期的Unix秒数 $targetDate = Get-Date -Date '2020-01-01Z' [int64]($targetDate - [datetime]::UnixEpoch).TotalSeconds
3. 兼容.NET习惯的DateTimeOffset写法
如果你偏好.NET的DateTimeOffset,也可以用PowerShell风格的写法确保基于UTC:
# 直接创建UTC的DateTimeOffset ([datetimeoffset]::Parse('2020-01-01', [cultureinfo]::InvariantCulture, [System.Globalization.DateTimeStyles]::AssumeUniversal)).ToUnixTimeSeconds() # 从Get-Date的UTC时间转换 ([datetimeoffset](Get-Date -Utc)).ToUnixTimeSeconds()
总结
如果要最贴合PowerShell的惯用风格,优先选择Get-Date -Utc -UFormat %s(配合类型转换取整数)来获取Unix时间戳秒数;处理指定日期时,记得确保日期是基于UTC的(要么直接解析UTC字符串,要么将本地时间转成UTC)。
内容的提问来源于stack exchange,提问作者Anthony Mastrean

