2016-04-12 1 views
4

Я пробовал много разных способов, и я не могу понять, как это правильно.Изменить формат даты с "yyyymmdd" на "mm/dd/yyyy"

Вот код того, что я пытался до сих пор ...

[String]$dateValue = '20161212' 
[String]$dateStamp = $dateValue -f (Get-Date) 
[String]$dateStamp2 = ([datetime]::parseexact($dateValue,"yyyyMMdd",[System.Globalization.CultureInfo]::InvariantCulture)).Date 
[String]$dateStamp3 = ([datetime]::FromFileTime($dateValue)).ToString('g') 

Write-Host '$dateStamp =' $dateStamp 
Write-Host '$dateStamp2 =' $dateStamp2 
Write-Host '$dateStamp3 =' $dateStamp3 

Текущий код выхода

$dateStamp = 20161212 
$dateStamp2 = 12/12/2016 00:00:00 
$dateStamp3 = 12/31/1600 5:00 PM 

Желаемая код выхода

$dateStamp = 12/12/2016 

Любые идеи?

+2

'$ dateStamp2' кажется правильным. Как вы собираетесь придумывать 3:00 PM, когда эта информация не находится в исходной строке? –

+2

$ dateStamp3' совершенно не так, потому что вы не начинаете с FileTime, и поэтому вы не можете получить то, что хотите от 'FromFileTime' (это должно быть ясно, читая имя метода). Откуда это воображаемое время исходит из того, что вы хотите получить? Вы никогда не назначали его при инициализации '$ dateValue'; Ожидаете ли вы 3:00 вечера только волшебным образом? –

+0

TBH, я не думал о том, как обращаться с hh: mm. Я думаю, что фактическое время не имеет значения, поскольку оно не предусмотрено, но формат должен по крайней мере быть «**/**/****». Я обновил вопрос, чтобы исключить HH: MM. –

ответ

5

Как только у вас есть объект datetime, его легко преобразовать в какой-либо строковый формат, который вам нужен. Вы так близко со своей второй попыткой. Добавление ToString позволяет указать строковый формат.

([datetime]::parseexact($dateValue,"yyyyMMdd",[System.Globalization.CultureInfo]::InvariantCulture)).ToString("dd/MM/yyyy") 
+0

Отлично! Спасибо, Ник! –

1

Учитывая, что у вас есть культура-инвариантная строка в качестве входных данных и что вы хотите формат фиксированного вывода, вы можете также выполнить строковые синтаксический, без необходимости преобразования в промежуточном [datetime] например:

> '20161213' -replace '\d{2}(\d{2})(\d{2})(\d{2})', '$2/$3/$1' 
12/13/16 

Обратите внимание, что я изменил день, чтобы отличаться от месяца, чтобы лучше выделить переформатирование, которое имеет место.

В целом, хотя метод [datetime], продемонстрированный в Nick's helpful answer, дает вам максимальную гибкость.

+0

Хорошее предложение. Однако я не слишком комфортно занимаюсь регулярным выражением при работе с сопоставлениями дат и предпочитаю использовать библиотеку [datetime]. Но я, конечно же, благодарю вас за действительную мысль (я никогда не знаю, когда что-то подобное может быть полезно). :) –

+0

@FiddleFreak: Мое удовольствие; да, '[datetime]' обычно предпочтительнее, особенно когда речь идет о сравнении сравнений/расчетов/осведомленности о культуре. – mklement0