Как отформатировать DateTime в PowerShell

156

Я могу отформатировать Get-Date командлет без проблем, как это:

$date = Get-Date -format "yyyyMMdd"

Но как только я получил дата в переменной, как мне ее отформатировать? Утверждение ниже

$dateStr = $date -format "yyyMMdd"

возвращает эту ошибку:

«Вы должны предоставить выражение значения в правой части оператора -f»

Ev.
источник
3
Я действительно хотел, чтобы этот синтаксис работал. $date -format "yyyMMdd"гораздо более интуитивно понятен для форматирования одного объекта, чем '{0:yyyyMMdd}' -f $date.
Орад
Кроме того: в PowerShell есть -fоператор (с синтаксисом, как показано в принятом ответе), но нет -formatоператора. Сообщение об ошибке жалуется на то, что он ormatне является допустимым операндом RHS, но обратите внимание, что последние версии PowerShell фактически выдают другое, более полезное сообщение об ошибке:Unexpected token '-format' in expression or statement
mklement0

Ответы:

221

Так же, как и в .NET :

$DateStr = $Date.ToString("yyyyMMdd")

Или:

$DateStr = '{0:yyyyMMdd}' -f $Date
мистифицировать
источник
26

На вопрос дан ответ, но отсутствует дополнительная информация:

Переменная против командлета

У вас есть значение в $Dateпеременной и -fоператор делает работу в таком виде: 'format string' -f values. Если вы звоните, Get-Date -format "yyyyMMdd"вы вызываете командлет с некоторыми параметрами. Значение "yyyyMMdd" является значением для параметра Format(try help Get-Date -param Format).

-f оператор

Есть много строк формата. Посмотрите хотя бы на часть1 и часть2 . Она использует string.Format('format string', values'). Думайте об этом как 'format-string' -f values, потому что -fоператор работает очень похоже как string.Formatметод (хотя есть некоторые различия (для получения дополнительной информации посмотрите на вопрос о переполнении стека: как именно работает RHS оператора -f PowerShell? ).

stej
источник
3
Он говорит, что параметр -Format заставляет Get-DateTime возвращать строку, а не объект DateTime. Таким образом, ваша переменная $ Date больше не может быть отформатирована должным образом. Я ДЕЙСТВИТЕЛЬНО желаю, чтобы параметр -Format просто изменил поведение по умолчанию для метода ToString объекта DateTime. Тогда это будет работать, как вы ожидали.
Натан Хартли
19

Вы могли бы сделать одну вещь:

$date.ToString("yyyyMMdd")
Джон Уэлдон
источник
Спасибо, что я сделал это - мне жаль, что -формат не работает, хотя.
Ев.
18

Очень удобное - но, вероятно, не слишком эффективное - решение состоит в том, чтобы использовать функцию-член GetDateTimeFormats(),

$d = Get-Date
$d.GetDateTimeFormats()

Это выводит большой строковый массив стилей форматирования для значения даты. Затем вы можете выбрать один из элементов массива через []оператор, например,

PS C:\> $d.GetDateTimeFormats()[12]
Dienstag, 29. November 2016 19.14
davidhigh
источник
16

Простой и приятный способ это:

$time = (Get-Date).ToString("yyyy:MM:dd")

Стивен Миллер
источник
2
Это был единственный подход, который не выбрасывал для меня ошибку выражения с нулевым значением. Спасибо.
Ecker00
7

Сделайте это, если вам абсолютно необходимо использовать -Formatопцию:

$dateStr = Get-Date $date -Format "yyyMMdd"

тем не мение

$dateStr = $date.toString('yyyMMdd')

вероятно, более эффективно .. :)

tplive
источник
$dateStr = (Get-Date $date -Format "yyyMMdd")приводит к типу объекта, который отличается от объекта datetime. Попробуйте поиграть с этим. $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") Вы сразу увидите разницу.
Джейми Маршалл
1
Ну, да .. Это строка, поэтому я назвал ее dateStr .. :) OP пытался отформатировать объект даты в строку.
17
4

Если вы пришли сюда, чтобы использовать это в cmd.exe(в пакетном файле):

powershell -Command (Get-Date).ToString('yyyy-MM-dd')
Ярослав Заруба
источник
4

Мне нужно было время и небольшие изменения в формате. Это прекрасно работает для моих целей:

$((get-date).ToLocalTime()).ToString("yyyy-MM-dd HHmmss")

2019-08-16 215757

Согласно @ mklement0 в комментариях, это должно дать тот же результат:

(get-date).ToString("yyyy-MM-dd HHmmss")
Адвокат дьявола
источник
3

Очень информативный ответ от @stej , но вот короткий ответ: среди прочих вариантов у вас есть 3 простых варианта форматирования [System.DateTime], хранящихся в переменной:

  1. Передайте переменную в командлет Get-Date : Get-Date -Format "HH:mm" $date

  2. Используйте метод toString () : $date.ToString("HH:mm")

  3. Использовать составное форматирование : "{0:HH:mm}" -f $date

Эдди Кумар
источник
3

Для тех, кто пытается отформатировать текущую дату для использования в заголовке HTTP, используйте формат «r» (сокращение от RFC1123), но остерегайтесь предостережения ...

PS C:\Users\Me> (get-date).toString("r")
Thu, 16 May 2019 09:20:13 GMT
PS C:\Users\Me> get-date -format r
Thu, 16 May 2019 09:21:01 GMT
PS C:\Users\Me> (get-date).ToUniversalTime().toString("r")
Thu, 16 May 2019 16:21:37 GMT

Т.е. не забудьте использовать «ToUniversalTime ()»

Питер Л
источник
Используйте это с "o" для даты и времени в стиле "xml"
JohnOpincar