PowerShell - 将UTC转换为英国夏令时

时间:2016-09-09 16:15:10

标签: powershell datetime utc datetime-conversion

我编写了一个简单的函数来将任何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类型?

任何解释都会非常感激。

2 个答案:

答案 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}}(此属性只有两个有效值 - UTCUTC用于其他所有内容。获取此参数的函数最初识别UTC类型时间,并且无法检测夏令时,因为UTC时区根本不支持它。 在将字符串发送到函数的第二种情况中,这里的主要区别在于,一旦将实际字符串转换为函数内的Local对象,它就使用DateTime,默认情况下使用Get-Date实例化结果对象本地机器的时间(我在立陶宛工作),因此IsDaylightSavingTime()现在可以返回$True值,因为我的本地时区支持它。