Ошибка преобразования String в DateTime в PowerShell (раньше он работал) - PullRequest
0 голосов
/ 08 октября 2018

Скрипт анализирует значения из файла *.csv.Одним из значений является отметка времени в формате 7/21/2018 7:07 AM UTC

Эта строка раньше работала:

$DR.Item($property.Name) = (
 [System.DateTime](Get-Date($property.value -replace " UTC", ""))
).TolocalTime() -f "MM/d/yyyy HH:mm:ss"

Она больше не работает.Я получаю следующую ошибку:

Get-Date : Cannot bind parameter 'Date'. Cannot convert value "7/21/2018 7:07 AM" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."

1 Ответ

0 голосов
/ 08 октября 2018

Ошибка выполнения вашей команды говорит о том, что текущая культура ([cultureinfo]::CurrentCulture) во время выполнения является чем-то другим , чем en-US (американский-английский), в этом случае Get-Date не распознает строку даты / времени, такую ​​как "7/21/2018 7:07 AM [1] .

Решение состоит в том, чтобы использовать [datetime] приведение напрямую , без привлечения Get-Date, потому что [datetime] cast всегда использует инвариантную культуру , которая подобна культура en-US в отношении форматов даты / времени:

$DR.Item($property.Name) = ([datetime] ($property.value -replace ' UTC$')) -f "MM/d/yyyy HH:mm:ss"

Предупреждение : Ваш вызов .ToLocalTime() не нужен для форматирования вывода, как экземпляр [datetime]вы получите, как по умолчанию, локальное время будет вести себя локально, даже если технически оно не зависит от часового пояса, что отражено в его свойстве .Kind, содержащем Unspecified.То есть ваши выходные данные будут отражать дату и время UTC без указания этого.
Если вы действительно хотите перевести входную метку времени UTC в эквивалентное местное время, потребуется дополнительная работа:

$dtUtc = [datetime]::SpecifyKind(($property.value -replace ' UTC$'), 'Utc')
$DR.Item($property.Name) = $dtUtc.ToLocalTime() -f "MM/d/yyyy HH:mm:ss"

[1] PowerShell обычно использует инвариантную культуру , когда дело доходит до преобразования типов из строки в строку, но, что любопытно, не делает этогопри передаче строк в виде аргументов в скомпилированных командлетов , в отличие от [advanced] функций (написано в PowerShell).Это известная проблема , но она может быть не решена из-за обратной совместимости.

...