К сожалению, не все AM / PM указывают американские форматы даты.
Без дополнительной информации вы не сможете решить вашу проблему из-за присущих ей неясностей:
9/11/2007 10:16:27 AM
Невозможно определить, является ли это отметкой времени en-US
(США), относящейся к 11-му дню сентября (первый месяц), или отметкой времени en-GB
(Великобритания), относящейся к девятому день ноября (первый день).
Только если первый или второй компонент имеет значение 13
или выше en-US
или en-GB
подразумевается , и только такие временные метки будут правильно обрабатываться try
/ catch
logi c в вашем вопросе.
Если вы предоставите дополнительное ограничение, что все даты должны встретить, решение возможно.
Например, если вы знаете, что все даты попадают в данный месяц :
# The month that all log entries are expected to fall into:
$refMonth = 9 # September, for example.
# Create an array of the cultures to use for parsing:
[cultureinfo[]] $cultures = 'en-GB', 'en-US'
'11/9/2007 17:02:15',
'9/11/2007 05:02:44 PM',
'11/9/2007 05:03:01 PM' | ForEach-Object {
$ok = $false; [datetime] $dt = 0
foreach ($culture in $cultures) {
$ok = [datetime]::TryParse($_, $culture, 'None', [ref] $dt) -and $dt.Month -eq $refMonth
if ($ok) { break }
}
if (-not $ok) { Write-Error "Not recognized as a date in the expected month: $_" }
else { $date } # Output the resulting date.
}
Выше приведено следующие, показывая, что все даты были проанализированы как месяц 9
(сентябрь) даты :
Tuesday, September 11, 2007 5:02:15 PM
Tuesday, September 11, 2007 5:02:44 PM
Tuesday, September 11, 2007 5:03:01 PM