Ответ 1
Так же, как и в .NET:
$DateStr = $Date.ToString("yyyyMMdd")
Или же:
$DateStr = '{0:yyyyMMdd}' -f $Date
Я могу без проблем отформатировать командлет Get-Date
:
$date = Get-Date -format "yyyyMMdd"
Но как только у меня есть дата в переменной, как мне ее отформатировать? Утверждение ниже
$dateStr = $date -format "yyyMMdd"
возвращает эту ошибку:
"Вы должны предоставить выражение значения в правой части оператора" -f "
Так же, как и в .NET:
$DateStr = $Date.ToString("yyyyMMdd")
Или же:
$DateStr = '{0:yyyyMMdd}' -f $Date
На вопрос дан ответ, но отсутствует дополнительная информация:
Переменная против командлета
У вас есть значение в переменной $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 работает?).
Одна вещь, которую вы можете сделать, это:
$date.ToString("yyyyMMdd")
Очень удобное - но, вероятно, не слишком эффективное - решение заключается в использовании функции-члена GetDateTimeFormats()
,
$d = Get-Date
$d.GetDateTimeFormats()
Это выводит большой строковый массив стилей форматирования для значения даты. Затем вы можете выбрать один из элементов массива с помощью []
-operator, например,
PS C:\> $d.GetDateTimeFormats()[12]
Dienstag, 29. November 2016 19.14
Простой и приятный способ:
$time = (Get-Date).ToString("yyyy:MM:dd")
или просто
(Get-Date).ToString("yyyy:MM:dd")
Сделайте это, если вам абсолютно необходимо использовать -Format
:
$dateStr = (Get-Date $date -Format "yyyMMdd")
тем не мение
$dateStr = $date.toString('yyyMMdd')
вероятно, более эффективно.. :)
Если вы здесь, чтобы использовать это в DOS:
powershell -Command (Get-Date).ToString('yyyy-MM-dd')
Для тех, кто пытается отформатировать текущую дату для использования в заголовке 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()"
Очень информативный ответ от @stej, но вот короткий ответ: Среди других вариантов у вас есть 3 простых варианта форматирования [System.DateTime], хранящихся в переменной:
Передайте переменную командлету Get-Date: Get-Date -Format "HH:mm" $date
Использовать метод toString(): $date.ToString("HH:mm")
Использовать форматирование Composite: "{0:HH:mm}" -f $date
Мне нужно было время и небольшие изменения в формате. Это прекрасно работает для моих целей:
$((get-date).ToLocalTime()).ToString("yyyy-MM-dd HHmmss")
2019-08-16 215757