2016-09-09 2 views
0

Я написал простую функцию для преобразования любого времени UTC в текущее время Великобритании (в зависимости от того, применяется ли летнее время в текущем сезоне, результат совпадает с тем же UTC или UTC + 1):PowerShell - Преобразование UTC в британское летнее время

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

'[TimeZoneInfo] :: ConvertTimeBySystemTimeZoneId ($ UTCTime, 'UTC', 'GMT Standard Time')' – PetSerAl

+0

@PSA, GMT НЕ время 'UK' –

+0

@JaquelineVanek Не ты Лондон здесь '[TimeZoneInfo]: : FindSystemTimeZoneById ('GMT Standard Time'). DisplayName'? Лондон больше не в Великобритании? – PetSerAl

ответ

0

После обширного тестирования и обсуждения с коллегами-сверстниками, я думаю, что у меня есть ответ на мой первоначальный вопрос.

Прежде всего, благодаря @PetSerAl, предлагающему использовать установленный Microsoft часовой пояс GMT, время, которое меня и других пользователей в сообществе считают неоднозначным, учитывая, что фактическое GMT ​​имеет разное смещение в реальном времени жизнь (следовательно, путаница), однако, я нашел, что это именно то, что мне нужно использовать в моем случае.

Так почему же я получаю разные результаты при передаче строки и объекта DateTime в то же время в UTC? Ответ таков:

Как только я передал объект функции, которая была результатом получения времени от штампа создания файла в UTC, он автоматически инициировался как подходящий объект типа времени UTC, имеющий значение .Kind для значения UTC (для этого свойства действуют только два допустимых значения - UTC и Local для всего остального). Функция, получающая этот параметр, первоначально распознала время типа UTC и не смогла обнаружить летнее время, поскольку часовой пояс UTC просто не поддерживает его. Во втором случае отправки строки в функцию основное отличие заключалось в том, что после преобразования фактической строки в объект DateTime внутри моей функции он использовал Get-Date, который по умолчанию создает экземпляр объекта результата с использованием времени локальной машины (я работаю в Литве), и поэтому IsDaylightSavingTime() теперь может вернуть значение $True, так как мой местный часовой пояс его поддерживает.

0

Я заметил неверное предположение, что GMT был британским временем в течение нескольких лет назад (во время работы в Microsoft). Думаю, я подал на него ошибку, но я не уверен. Похоже, вам нужен пользовательский часовой пояс.

Я нашел этот интересный пост при определении особых часовых поясов: http://subjectivecoder.blogspot.com.au/2013/04/creating-custom-windows-timezones.html. Это можно сделать с помощью PowerShell.

Смежные вопросы