Преобразовать UT C в CEST / CET - PullRequest
       4

Преобразовать UT C в CEST / CET

0 голосов
/ 03 августа 2020

У меня есть файл excel, где в одном столбце у меня есть список дат за разные периоды времени. В настоящее время мой сценарий PowerShell преобразует дату и время в метку времени unix и всегда добавляет 7200 секунд, чтобы сохранить результаты в часовом поясе CEST, но результаты не всегда точны и правильны, иногда у меня есть разница в 1 час, потому что его нужно добавить 3600 вместо 7200. Я хотел бы это исправить, но не знаю, как это сделать.

CEST: UTC + 02: 00, летнее время) летом (с последнего воскресенья марта по последнее воскресенье октября). CET: UTC + 01: 00,

Scheduled Start Date
29/06/2020 00:00:00
17/02/2020 12:56:16
17/02/2020 12:56:16
17/02/2020 12:56:16
17/02/2020 12:56:16
16/03/2020 08:00:00
16/03/2020 08:00:00
16/03/2020 08:00:00
26/08/2020 07:00:00
28/09/2020 07:00:00
20/05/2020 18:00:00
03/06/2020 00:00:00
25/05/2020 18:00:00
25/05/2020 18:00:00
25/05/2020 18:00:00

Часть моего кода:

$CEST = 7200
$CSV = Import-Csv -Path "D:\file.csv"  -Delimiter ';' | Select-Object -SkipLast 1 
$CSV | ForEach-Object { 

    
     $_.'Scheduled Start Date' = $CEST + [Math]::Floor([decimal](Get-Date([datetime]::ParseExact($_.'Scheduled Start Date', 'dd/MM/yyyy HH:mm:ss', $null)).ToUniversalTime()-uformat "%s"))
   $_.'Scheduled End Date' = $CEST + [Math]::Floor([decimal](Get-Date([datetime]::ParseExact($_.'Scheduled End Date', 'dd/MM/yyyy HH:mm:ss', $null)).ToUniversalTime()-uformat "%s")) 

       $_.'Actual Start Date' = 
            If([string]::IsNullOrEmpty($_.'Actual Start Date')) {
                  $_.'Actual Start Date' = ""
        }
    
             ElseIf(![string]::IsNullOrEmpty($_.'Actual Start Date')) {  
                      
             $CEST + [Math]::Floor([decimal](Get-Date([datetime]::ParseExact($_.'Actual Start Date', 'dd/MM/yyyy HH:mm:ss', $null)).ToUniversalTime()-uformat "%s"))
               $_.'Scheduled Start Date' = $CEST + [Math]::Floor([decimal](Get-Date([datetime]::ParseExact($_.'Actual Start Date', 'dd/MM/yyyy HH:mm:ss', $null)).ToUniversalTime()-uformat "%s"))    
                   }


       $_.'Actual End Date' = 
            If([string]::IsNullOrEmpty($_.'Actual End Date')) {
                  $_.'Actual End Date' = ""
        }
    
             ElseIf(![string]::IsNullOrEmpty($_.'Actual End Date')) {  
                      
             $CEST + [Math]::Floor([decimal](Get-Date([datetime]::ParseExact($_.'Actual End Date', 'dd/MM/yyyy HH:mm:ss', $null)).ToUniversalTime()-uformat "%s"))
             $_.'Scheduled End Date' = $CEST + [Math]::Floor([decimal](Get-Date([datetime]::ParseExact($_.'Actual End Date', 'dd/MM/yyyy HH:mm:ss', $null)).ToUniversalTime()-uformat "%s"))
                    
                   }    
                   
                  
} 
$CSV | 
Export-Csv -Path "D:\fileUnixTimeStamp_tmp.csv" -Delimiter ';' -NoTypeInformation

Спасибо за поддержку!

1 Ответ

0 голосов
/ 03 августа 2020

Вместо того, чтобы самостоятельно добавлять смещение часового пояса, здесь может помочь небольшая вспомогательная функция в верхней части скрипта:

function ConvertTo-UnixTimeStamp([DateTime]$date) {
    # old PS versions use:
    # [DateTime]$origin = New-Object System.DateTime 1970, 1, 1, 0, 0, 0, 0, Utc
    [DateTime]$origin = [DateTime]::new(1970, 1, 1, 0, 0, 0, 0, 'Utc')
    [TimeSpan]$diff = (Get-Date $date).ToUniversalTime() - $origin
    return [int64][Math]::Floor($diff.TotalSeconds)
}

Затем вы можете временно установить текущий часовой пояс на CET и сбросить его на что это было потом, поэтому преобразования с .ToUniversalTime() будут использовать правильное смещение UT C и DayLightSavingTime для этого часового пояса.

# temporarily set the TimeZone to CET
$myTimeZone = (Get-TimeZone).Id
# you can get the Id by looking at the output from Get-Timezone -ListAvailable
Set-TimeZone -Id 'Central European Standard Time'

$CSV = Import-Csv -Path "D:\file.csv"  -Delimiter ';' | Select-Object -SkipLast 1 
$CSV | ForEach-Object { 
    # parse out the dates as Local time
    # to keep the code readable I'll convert to local variables first
    $scheduledStart = if ([string]::IsNullOrWhiteSpace($_.'Scheduled Start Date')) { $null }
                      else { ConvertTo-UnixTimeStamp ([datetime]::ParseExact($_.'Scheduled Start Date', 'dd/MM/yyyy HH:mm:ss', $null)) }

    $scheduledEnd   = if ([string]::IsNullOrWhiteSpace($_.'Scheduled End Date')) { $null }
                      else { ConvertTo-UnixTimeStamp ([datetime]::ParseExact($_.'Scheduled End Date', 'dd/MM/yyyy HH:mm:ss', $null)) }

    $actualStart    = if ([string]::IsNullOrWhiteSpace($_.'Actual Start Date')) { $null }
                      else { ConvertTo-UnixTimeStamp ([datetime]::ParseExact($_.'Actual Start Date', 'dd/MM/yyyy HH:mm:ss', $null)) }

    $actualEnd      = if ([string]::IsNullOrWhiteSpace($_.'Actual End Date')) { $null }
                      else { ConvertTo-UnixTimeStamp ([datetime]::ParseExact($_.'Actual End Date', 'dd/MM/yyyy HH:mm:ss', $null)) }

    # rewrite the dates as Unix timestamps
    $_.'Scheduled Start Date' = $scheduledStart
    $_.'Scheduled End Date'   = $scheduledEnd
    $_.'Actual Start Date'    = $actualStart
    $_.'Actual End Date'      = $actualEnd
} 
$CSV | Export-Csv -Path "D:\fileUnixTimeStamp_tmp.csv" -Delimiter ';' -NoTypeInformation

# reset the timezone
Set-TimeZone -Id $myTimeZone
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...