Ошибка: «Строка не была распознана как допустимый DateTime». - PullRequest
0 голосов
/ 06 мая 2020

У меня проблема с командой Get-Date, и я получаю сообщение об ошибке:

 Get-Date : Cannot bind parameter 'Date'. Cannot convert value "29/01/2020 00:00:00" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."

моя часть кода:

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

         $_.'Scheduled Start Date' = $CEST + [Math]::Floor([decimal](Get-Date(Get-Date $_.'Scheduled Start Date').ToUniversalTime()-uformat "%s"))
       $_.'Scheduled End Date' = $CEST + [Math]::Floor([decimal](Get-Date(Get-Date $_.'Scheduled End Date').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(Get-Date $_.'Actual Start Date').ToUniversalTime()-uformat "%s"))
                   $_.'Scheduled Start Date' = $CEST + [Math]::Floor([decimal](Get-Date(Get-Date $_.'Actual Start Date').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(Get-Date $_.'Actual End Date').ToUniversalTime()-uformat "%s"))
                 $_.'Scheduled End Date' = $CEST + [Math]::Floor([decimal](Get-Date(Get-Date $_.'Actual End Date').ToUniversalTime()-uformat "%s"))

                       }  


} 
$CSV | 
Export-Csv -Path "D:\1_tmp.csv" -Delimiter ';' -NoTypeInformation

Даты хранятся в файле 1.csv в формате, как показано ниже, в столбцах во многих строках (запланированная дата окончания, запланированная дата начала, фактическая дата окончания, фактическая дата начала)

27/05/2020 07:00:00

Когда я запускаю команду Get-Date на компьютере, вывод будет:

Wednesday, May 6, 2020 2:59:59 PM

Пожалуйста, поддержите!

1 Ответ

0 голосов
/ 06 мая 2020

Глядя на ваш код, вы хотите преобразовать строки даты в CSV, записанные в формате dd/MM/yyyy HH:mm:ss, в Unix отметки времени с добавленным значением $CEST часового пояса.

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

function Get-TimeStamp ([string]$dateString, [int]$offset = 0) {
    if (![string]::IsNullOrWhiteSpace($dateString)) {
        $epoch = [DateTime]::new(1970, 1, 1, 0, 0, 0, 0, 'Utc')
        $date  = Get-Date ([datetime]::ParseExact($dateString, 'dd/MM/yyyy HH:mm:ss', $null))
        $diff  = (Get-Date $date).ToUniversalTime() - $epoch
        return [int64]([Math]::Floor($diff.TotalSeconds) + $offset)

        # OR use the -UFormat way like
        # $date = Get-Date ([datetime]::ParseExact($dateString, 'dd/MM/yyyy HH:mm:ss', $null)).toUniversalTime() -UFormat '%s'
        # return [int64]$date + $offset
    }
}

Ниже этой функции код будет выглядеть так:

$CEST = 7200
Import-Csv -Path "D:\1.csv"  -Delimiter ';' | Select-Object -SkipLast 2 | ForEach-Object {
    [PsCustomObject] @{
        'Scheduled Start Date' = Get-TimeStamp $_.'Scheduled Start Date' $CEST
        'Scheduled End Date' = Get-TimeStamp $_.'Scheduled End Date' $CEST
        'Actual Start Date' = Get-TimeStamp $_.'Actual Start Date' $CEST
        'Actual End Date' = Get-TimeStamp $_.'Actual End Date' $CEST
    }
} | Export-Csv -Path "D:\1_tmp.csv" -Delimiter ';' -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...