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