0

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

任何解释将不胜感激。

4

2 回答 2

1

在与同行同事进行广泛的测试和讨论之后,我想我现在有了最初问题的答案。

首先,感谢@PetSerAl 建议使用 Microsoft 定义的“GMT 标准时间”时区,我和社区中的其他用户发现该时区的命名有争议,因为实际 GMT 在现实生活中具有不同的偏移量(因此混淆),但是,我发现它正是我需要使用的。

那么为什么在 UTC 中传递同一时间的字符串和 DateTime 对象时会得到不同的结果呢?答案是这样的:

一旦我将对象传递给函数,这是从 UTC 文件创建时间戳中获取时间的结果,它会自动启动为正确的 UTC 时间类型对象,并将属性.Kind设置为 value UTC(此属性只有两个有效值-UTC以及Local其他一切)。获取此参数的函数最初识别 UTC 类型时间,它无法检测夏令时,因为 UTC 时区根本不支持它。在将字符串发送到函数的第二种情况下,这里的主要区别在于,一旦将实际字符串转换为DateTime它正在使用的函数内部的对象Get-Date,默认情况下会使用本地机器的时间实例化结果对象(我在立陶宛工作)因此IsDaylightSavingTime()现在可以返回该$True值,因为我的本地时区确实支持它。

于 2016-09-25T18:15:17.893 回答
0

我注意到几年前 GMT 是英国时间的错误假设(在微软工作时)。我想我为此提交了一个错误,但我不确定。似乎您需要一个自定义时区。

我发现这篇关于定义自定义时区的有趣帖子:http: //subjectivecoder.blogspot.com.au/2013/04/creating-custom-windows-timezones.html。使用 PowerShell 应该可以做到这一点。

于 2016-09-10T01:57:59.927 回答