Cara memformat DateTime di PowerShell


156

Saya dapat memformat Get-Datecmdlet tidak ada masalah seperti ini:

$date = Get-Date -format "yyyyMMdd"

Tapi begitu saya punya tanggal dalam sebuah variabel, bagaimana saya memformatnya? Pernyataan di bawah ini

$dateStr = $date -format "yyyMMdd"

mengembalikan kesalahan ini:

"Anda harus memberikan ekspresi nilai di sisi kanan operator '-f'"


3
Sebenarnya saya berharap sintaks ini berhasil. $date -format "yyyMMdd"jauh lebih intuitif untuk memformat objek tunggal daripada '{0:yyyyMMdd}' -f $date.
orad

Sebagai tambahan: PowerShell memiliki -foperator (dengan sintaks seperti yang ditunjukkan pada jawaban yang diterima), tetapi tidak ada -formatoperator. Pesan kesalahan mengeluh tentang ormattidak menjadi operan RHS yang valid, tetapi perhatikan bahwa versi PowerShell baru-baru ini benar-benar memancarkan pesan kesalahan yang berbeda dan lebih bermanfaat:Unexpected token '-format' in expression or statement
mklement0

Jawaban:


221

Sama seperti yang Anda lakukan di .NET :

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

Atau:

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

26

Pertanyaan dijawab, tetapi ada beberapa informasi yang hilang:

Variabel vs. Cmdlet

Anda memiliki nilai dalam $Datevariabel dan -foperator yang bekerja dalam formulir ini: 'format string' -f values. Jika Anda memanggil Get-Date -format "yyyyMMdd"Anda memanggil cmdlet dengan beberapa parameter. Nilai "yyyyMMdd" adalah nilai untuk parameter Format(coba help Get-Date -param Format).

-f operator

Ada banyak format string. Lihatlah setidaknya pada part1 dan part2 . Dia menggunakan string.Format('format string', values'). Anggap saja sebagai 'format-string' -f values, karena -foperator bekerja sangat mirip dengan string.Formatmetode (walaupun ada beberapa perbedaan (untuk informasi lebih lanjut lihat pertanyaan di Stack Overflow: Bagaimana tepatnya RHS dari -f operator PowerShell's bekerja? ).


3
Apa yang dia katakan adalah bahwa parameter -Format menyebabkan Get-DateTime mengembalikan string, bukan objek DateTime. Jadi $ Date variabel Anda tidak lagi dapat diformat seperti yang diharapkan. Saya BENAR-BENAR berharap parameter -Format hanya akan mengubah perilaku default metode ToString objek DateTime tertentu. Maka itu akan bekerja seperti yang Anda harapkan.
Nathan Hartley

19

Satu hal yang bisa Anda lakukan adalah:

$date.ToString("yyyyMMdd")

Terima kasih saya melakukan ini - mengganggu saya bahwa -format tidak berfungsi sekalipun.
Ev.

18

Solusi yang sangat mudah - tetapi mungkin tidak terlalu efisien - adalah dengan menggunakan fungsi anggota GetDateTimeFormats(),

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

Ini menghasilkan string-array besar gaya pemformatan untuk nilai-tanggal. Anda kemudian dapat memilih salah satu elemen array melalui []-operator, misalnya,

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

16

Cara sederhana dan menyenangkan adalah:

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


2
Ini adalah satu-satunya pendekatan yang tidak menghasilkan kesalahan ekspresi bernilai nol untuk saya. Terima kasih.
Ecker00

7

Lakukan ini jika Anda benar-benar perlu menggunakan -Formatopsi:

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

Namun

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

mungkin lebih efisien .. :)


$dateStr = (Get-Date $date -Format "yyyMMdd")menghasilkan tipe objek yang berbeda dari objek datetime. Cobalah bermain-main dengan ini. $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") Anda akan segera melihat perbedaannya.
Jamie Marshall

1
Yah, ya .. Ini sebuah String, itu sebabnya saya menamakannya dateStr .. :) OP mencoba memformat objek tanggal ke String.
tplive

4

Jika Anda sampai di sini untuk menggunakan ini dalam cmd.exe(dalam file batch):

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

4

Saya membutuhkan waktu dan sedikit variasi dalam format. Ini berfungsi baik untuk tujuan saya:

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

2019-08-16 215757

Menurut @ mklement0 dalam komentar, ini akan menghasilkan hasil yang sama:

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


3

Bagi siapa pun yang mencoba memformat tanggal saat ini untuk digunakan dalam tajuk HTTP, gunakan format "r" (kependekan dari RFC1123) tetapi waspadalah dengan peringatan ...

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

Yaitu Jangan lupa untuk menggunakan "ToUniversalTime ()"


Gunakan ini dengan "o" untuk datetimes style "xml"
JohnOpincar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.