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

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

$date = Get-Date -format "yyyyMMdd"

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

$dateStr = $date -format "yyyMMdd"

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

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

Ответ 1

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

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

Или же:

$DateStr = '{0:yyyyMMdd}' -f $Date

Ответ 2

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

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

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

-f оператор

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

Ответ 3

Одна вещь, которую вы можете сделать, это:

$date.ToString("yyyyMMdd")

Ответ 4

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

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

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

PS C:\> $d.GetDateTimeFormats()[12]
Dienstag, 29. November 2016 19.14

Ответ 5

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

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

или просто

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

Ответ 6

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

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

тем не мение

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

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

Ответ 7

Если вы здесь, чтобы использовать это в DOS:

powershell -Command (Get-Date).ToString('yyyy-MM-dd')

Ответ 8

Для тех, кто пытается отформатировать текущую дату для использования в заголовке 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()"

Ответ 9

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

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

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

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

Ответ 10

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

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

2019-08-16 215757