2016-08-31 2 views

ответ

2

Я выбрал бы ParseExact() с некоторым регулярным выражением, чтобы удалить все th, rd, st. Чем вы просто должны использовать правильный формат в ToString()

EDIT обновление кода, основанного на @JosefZ предложение.

foreach ($date in @(
    'July 27th, 2016' 
    'December 3rd, 2014' 
    'August 1st, 1998' 
    'March 2nd, 1979' 
)) { 
    $clean = $date -replace '(st|nd|rd|th),' 
    $dateObject = [datetime]::ParseExact($clean, 'MMMM d yyyy', [System.Globalization.CultureInfo]::InvariantCulture) 
    # Apparently, this works too ...  
    $dateObject = [datetime]$clean 
    $dateObject.ToString('yyyy-MM-dd') 
} 
+0

'$ dateObject = [datetime] $ clean' должно быть достаточно. Для моей локали 'ParseExact' вызывает _Exception, вызывающий« ParseExact »с аргументом« 3 »:« String не был признан допустимым DateTime. »_. Замените третий аргумент '$ null' на' [System.Globalization.CultureInfo] :: InvariantCulture'. – JosefZ

1

У меня нет достаточного количества комментариев, чтобы прокомментировать решение от BartekB, так что вот только небольшая альтернатива регулярного выражения его ответа.

foreach ($oldformat in @(
    'July 27th, 2016' 
    'December 3rd, 2014' 
    'August 1st, 1998' 
    'March 2nd, 1979') 
    ) 
{ 
$newformat = [datetime][regex]::replace($oldformat,' *..,',"") | Get-Date -Format "yyyy-MM-dd" 
Write-Host $newformat 
} 
0

В дополнение к методу, показанному @ Andrii-Matus, @BartekB, следующий способ - это то же самое.

$date_str = @(
    'July 27th, 2016' 
    'December 3rd, 2014' 
    'August 1st, 1998' 
    'March 2nd, 1979' 
) 

foreach ($date in $date_str){ 
    $newformat = $date -replace '(st|nd|rd|th),' 
    get-date $newformat -UFormat "%Y-%m-%d" 
} 
Смежные вопросы