我正在尝试在 PowerShell 中创建一个具有特定 UTC 时间戳的
DateTime
对象。最简单的方法是什么?
我尝试过:
Get-Date
-Format (Get-Culture).DateTimeFormat.UniversalSortableDateTimePattern
-Date "1970-01-01 00:00:00Z"
但我得到这个输出:
1969-12-31 19:00:00Z
还有几个小时休息。我的理解哪里出了问题?
DateTime
对象本身是使用正确的UTC时间创建的。但是当 PowerShell 打印出来时,它会将其转换为我当地的文化和时区,从而产生差异。
证明:
$UtcTime = Get-Date -Date "1970-01-01 00:00:00Z"
$UtcTime.ToUniversalTime()
(get-date).ToUniversalTime().ToString("yyyyMMddTHHmmssfffffffZ")
$utctime = New-Object DateTime 1970, 1, 1, 0, 0, 0, ([DateTimeKind]::Utc)
如果打印出
$utctime
,那么你会得到:
1. januar 1970 00:00:00
此外,
$utctime.Kind
已正确设置为 Utc
。
$time = [DateTime]::UtcNow | get-date -Format "yyyy-MM-ddTHH:mm:ssZ"
这似乎也有效
您可以使用SpecifyKind方法:
PS C:\IT\s3> $时间戳
2018 年 7 月 18 日星期三晚上 7:57:14
PS C:\IT\s3> $timestamp.kind
未指定
PS C:\IT\s3> $utctimestamp = [DateTime]::SpecifyKind($timestamp,[DateTimeKind]::Utc)
PS C:\IT\s3> $utctimestamp
2018 年 7 月 18 日星期三晚上 7:57:14
PS C:\IT\s3> $utctimestamp.kind
UTC
这就是 .NET 中的工作原理,对吧? PowerShell 仅调用 ToUniversalTime 方法。来自 http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx
The Coordinated Universal Time (UTC) is equal to the local time minus the
UTC offset. For more information about the UTC offset, see TimeZone.GetUtcOffset.
The conversion also takes into account the daylight saving time rule that applies
to the time represented by the current DateTime object.
在Powershell中,方法
New-Object DateTime(9999, 12, 31, 23, 59, 59, 59, ([DateTimeKind]::Utc))
是正确的,因为其他人在
Local
TZ 中创建时间,然后将其转换并存储在 UTC 中,然后可以再次以 UTC 格式显示,而上述方法首先以 UTC 格式创建时间。
您可以通过达到上述 .NET DateTime 限制来测试这一点,而如果您在限制下从“接受的解决方案”运行脚本
(Get-Date -Date "9999-12-31T23:59:59.99Z").ToUniversalTime()
从本地时区早于
UTC
的系统运行,例如UTC+1
,那么你会收到以下错误:
Get-Date: Cannot bind parameter 'Date'. Cannot convert value "9999-12-31T23:59:59.99Z" to type "System.DateTime". Error: "The DateTime represented by the string '9999-12-31T23:59:59.99Z' is out of range."