【发布时间】:2016-09-09 16:15:10
【问题描述】:
我编写了一个简单的函数来将任何 UTC 时间转换为当前英国时间(取决于当前季节是否应用夏令时,结果是相同的 UTC 或 UTC + 1):
function Convert-UTCToUKTime
{
[CmdletBinding()]
param
(
[Parameter(Mandatory = $true)] $UTCTime
)
$UKTime = (Get-Date -Date $UTCTime)
if ($UKTime.IsDaylightSavingTime() -eq $true)
{
$UKTime = $UKTime.AddHours(1)
}
return $UKTime
}
我也在不同的函数中使用它来获取当前的英国时间,它工作得很好:
function Get-UKTime
{
[CmdletBinding()]
[OutputType([System.String])]
param
(
[Parameter(Mandatory = $true)] [String] $Format
)
$UKTime = Convert-UTCToUKTime -Time ((Get-Date).ToUniversalTime())
return $UKTime.ToString($Format)
}
但是,当我尝试将文件创建时间(当然是 UTC)传递给转换函数时,它无法识别夏令时,因此返回一小时后的英国时间值(我试图通过使用Get-Date 完全相同的时间 - 没有问题):
[System.IO.FileInfo] $FileInfo = $FullFileName
$FileCreatedTime = Convert-UTCToUKTime -UTCTime (($FileInfo.CreationTimeUTC)
我找到了帮助我按预期工作的修复程序(通过在作为参数传递之前将 DateTime 类型转换为 String):
$FileCreatedTime = Convert-UTCToUKTime -UTCTime (($FileInfo.CreationTimeUTC).ToString("yyyy/MM/dd hh:mm:ss"))
但是,我不确定为什么会这样。将其与Get-Date 一起使用与将文件创建时间作为参数传递之间有什么区别,因为它们都具有相同的DateTime 类型?
任何解释都将不胜感激。
【问题讨论】:
-
[TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($UTCTime,'UTC','GMT Standard Time') -
@PSA,GMT 不是“英国”时间
-
@JaquelineVanek 你这里没有伦敦
[TimeZoneInfo]::FindSystemTimeZoneById('GMT Standard Time').DisplayName吗?伦敦不再是英国了吗? -
@PetSerAl,Jaqueline 是对的,GMT 与“英国时区”并不完全相同。 GMT 与 UTC 相同(我不需要转换它),它不支持从 3 月的最后一个星期日到 10 月的最后一个星期日引入夏令时,即这次是 BST(英国夏令时)比格林威治标准时间/世界标准时间早 1 小时。
-
@ArnoldasBendoraitis GMT 与 UTC 相同 那么为什么
[TimeZoneInfo]::ConvertTimeBySystemTimeZoneId([DateTime]::UtcNow,'UTC','GMT Standard Time')和[DateTime]::UtcNow返回不同的值? 不支持夏令时[TimeZoneInfo]::FindSystemTimeZoneById('GMT Standard Time').SupportsDaylightSavingTimeprintTrue为我。你真的试过了吗?或者你知道它不会起作用,也懒得去尝试?
标签: powershell datetime utc datetime-conversion