Як відформатувати DateTime в PowerShell


156

Я можу відформатувати Get-Dateкомандлет без проблем, як це:

$date = Get-Date -format "yyyyMMdd"

Але як тільки я отримав дату в змінній, як її відформатувати? Заява нижче

$dateStr = $date -format "yyyMMdd"

повертає цю помилку:

"Ви повинні надати значення значення у правій частині оператора '-f'"


3
Я насправді хотів, щоб цей синтаксис спрацював. $date -format "yyyMMdd"набагато інтуїтивніше для форматування одного об’єкта, ніж '{0:yyyyMMdd}' -f $date.
orad

В бік: 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

На питання відповіли, але бракує ще деякої інформації:

Змінна проти Cmdlet

У вас є значення в $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
Що він говорить, це те, що параметр -Format змушує Get-DateTime повертати рядок, а не об'єкт DateTime. Тож ваша змінна $ Date вже не може бути відформатована як очікувалося. Я дійсно бажаю, щоб параметр -Format просто змінив поведінку за замовчуванням методу ToString конкретного об'єкта DateTime. Тоді це діятиме так, як ви очікували.
Натан Хартлі

19

Ви можете зробити одне:

$date.ToString("yyyyMMdd")

Дякую, що я це зробив - помилки в мене, що -формат не працює.
Єв.

18

Дуже зручним, але, мабуть, не надто ефективним рішенням є використання функції члена GetDateTimeFormats(),

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

Це виводить великий масив рядків стилів форматування для значення date. Потім ви можете вибрати один з елементів масиву через []-operator, наприклад,

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

16

Простий і приємний спосіб:

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


2
Це був єдиний підхід, який не кинув для мене нульової помилки вираження. Дякую.
Ecker00

7

Зробіть це, якщо вам абсолютно потрібно скористатися -Formatопцією:

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

Однак

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

напевно, ефективніше .. :)


$dateStr = (Get-Date $date -Format "yyyMMdd")приводить до типу об'єкта, який відрізняється від об'єкта дати. Спробуйте пограти з цим. $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") Ви побачите різницю відразу.
Джеймі Маршалл

1
Ну так ... Це струна, тому я і назвав її dateStr .. :) ОП намагався відформатувати об'єкт дати у String.
tplive

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 , але ось коротка відповідь: Серед інших варіантів у вас є три простих варіанти форматування [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" datetimes
JohnOpincar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.