Jak sformatować DateTime w PowerShell

155

Mogę sformatować Get-Datecmdlet bez problemu w ten sposób:

$date = Get-Date -format "yyyyMMdd"

Ale kiedy już mam datę w zmiennej, jak ją sformatować? Poniższe oświadczenie

$dateStr = $date -format "yyyMMdd"

zwraca ten błąd:

„Musisz podać wyrażenie wartości po prawej stronie operatora„ -f ””

Ev.
źródło
3
Właściwie chciałem, żeby ta składnia działała. $date -format "yyyMMdd"jest znacznie bardziej intuicyjny w formatowaniu pojedynczego obiektu niż '{0:yyyyMMdd}' -f $date.
orad
Na marginesie: PowerShell ma -foperator (ze składnią pokazaną w zaakceptowanej odpowiedzi), ale nie ma -formatoperatora. Komunikat o błędzie narzeka, że ormatnie jest prawidłowym operandem RHS, ale zwróć uwagę, że ostatnie wersje PowerShell w rzeczywistości emitują inny, bardziej pomocny komunikat o błędzie:Unexpected token '-format' in expression or statement
mklement0

Odpowiedzi:

221

To samo, co w .NET :

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

Lub:

$DateStr = '{0:yyyyMMdd}' -f $Date
Josh
źródło
25

Odpowiedź na pytanie, ale brakuje kilku informacji:

Zmienna a polecenie cmdlet

Masz wartość w $Datezmiennej i -foperator działa w tej formie: 'format string' -f values. Jeśli wywołasz Get-Date -format "yyyyMMdd", wywołaj polecenie cmdlet z pewnymi parametrami. Wartość „rrrrMMdd” jest wartością parametru Format(try help Get-Date -param Format).

-f operator

Istnieje wiele ciągów formatujących. Spójrz przynajmniej na część 1 i część 2 . Ona używa string.Format('format string', values'). Pomyśl o tym tak 'format-string' -f values, ponieważ -foperator działa bardzo podobnie do string.Formatmetody (chociaż istnieją pewne różnice (więcej informacji można znaleźć w pytaniu o przepełnienie stosu: Jak dokładnie działa RHS operatora -f programu PowerShell? ).

stej
źródło
3
Mówi, że parametr -Format powoduje, że Get-DateTime zwraca ciąg, a nie obiekt DateTime. Dlatego zmienna $ Date nie może być już sformatowana zgodnie z oczekiwaniami. NAPRAWDĘ chciałbym, aby parametr -Format po prostu zmienił domyślne zachowanie metody ToString określonego obiektu DateTime. Wtedy będzie działać zgodnie z oczekiwaniami.
Nathan Hartley
19

Jedna rzecz, którą możesz zrobić, to:

$date.ToString("yyyyMMdd")
John Weldon
źródło
Dzięki, że to zrobiłem - wkurza mnie, że -format jednak nie działa.
Ev.
18

Bardzo wygodnym - ale chyba niezbyt wydajnym - rozwiązaniem jest użycie funkcji składowej GetDateTimeFormats(),

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

Spowoduje to utworzenie dużej tablicy ciągów stylów formatowania dla wartości daty. Następnie możesz wybrać jeden z elementów tablicy za pomocą []operatora, np.

PS C:\> $d.GetDateTimeFormats()[12]
Dienstag, 29. November 2016 19.14
davidhigh
źródło
16

Prosty i przyjemny sposób to:

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

Stephen Miller
źródło
2
To było jedyne podejście, które nie spowodowało błędu wyrażenia o wartości zerowej. Dzięki.
Ecker00
7

Zrób to, jeśli absolutnie potrzebujesz skorzystać z -Formatopcji:

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

jednak

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

jest chyba bardziej wydajne .. :)

tplive
źródło
$dateStr = (Get-Date $date -Format "yyyMMdd")daje w wyniku typ obiektu, który różni się od obiektu typu data-godzina. Spróbuj się tym bawić $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") . Od razu zauważysz różnicę.
Jamie Marshall
1
Cóż, tak ... To jest String, dlatego nazwałem go dateStr .. :) OP próbował sformatować obiekt daty na String.
tplive
4

Jeśli masz tutaj, aby użyć tego w cmd.exe(w pliku wsadowym):

powershell -Command (Get-Date).ToString('yyyy-MM-dd')
Jaroslav Záruba
źródło
4

Potrzebowałem czasu i niewielkiej zmiany formatu. To działa świetnie do moich celów:

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

2019-08-16 215757

Zgodnie z @ mklement0 w komentarzach powinno to dać ten sam wynik:

(get-date).ToString("yyyy-MM-dd HHmmss")
Adwokat diabła
źródło
3

Dla każdego, kto próbuje sformatować aktualną datę do użycia w nagłówku HTTP, użyj formatu "r" (skrót od RFC1123), ale uważaj na zastrzeżenie ...

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

To znaczy nie zapomnij użyć „ToUniversalTime ()”

Peter L.
źródło
Użyj tego z „o” dla
dat w