我编写了一个简单的函数来将任何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
类型?
任何解释都会非常感激。
答案 0 :(得分:0)
我注意到错误的假设,GMT是几年前的英国时间(在微软工作期间)。我想我提出了一个错误,但我不确定。您似乎需要一个自定义时区。
我发现这篇关于定义自定义时区的有趣帖子:http://subjectivecoder.blogspot.com.au/2013/04/creating-custom-windows-timezones.html。应该可以使用PowerShell执行此操作。
答案 1 :(得分:0)
经过与同行的广泛测试和讨论后,我想我现在已经回答了原来的问题。
首先,感谢@PetSerAl建议使用微软定义的'GMT标准时间'时区,我和社区中的其他用户发现这些时区有争议,因为实际GMT在现实生活中有不同的偏移(因此混乱),然而,我发现它正是我需要在我的情况下使用的。
那么为什么在UTC中传递同一时间的字符串和DateTime对象时会得到不同的结果?答案是:
一旦我将对象传递给函数,该函数是从UTC文件创建标记中获取时间的结果,它会自动启动为正确的UTC时间类型对象,将属性.Kind
设置为值{{ 1}}(此属性只有两个有效值 - UTC
和UTC
用于其他所有内容。获取此参数的函数最初识别UTC类型时间,并且无法检测夏令时,因为UTC时区根本不支持它。
在将字符串发送到函数的第二种情况中,这里的主要区别在于,一旦将实际字符串转换为函数内的Local
对象,它就使用DateTime
,默认情况下使用Get-Date
实例化结果对象本地机器的时间(我在立陶宛工作),因此IsDaylightSavingTime()
现在可以返回$True
值,因为我的本地时区支持它。