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 ””


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

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? ).


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")

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

16

Prosty i przyjemny sposób to:

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


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 .. :)


$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')

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")


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 ()”


Użyj tego z „o” dla
dat w
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.