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

Ev.
sumber
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
Josh
sumber
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? ).

stej
sumber
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")
John Weldon
sumber
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
Davidhigh
sumber
16

Cara sederhana dan menyenangkan adalah:

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

Stephen Miller
sumber
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 .. :)

tive
sumber
$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')
Jaroslav Záruba
sumber
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")
Pengacara Setan
sumber
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 ()"

Peter L.
sumber
Gunakan ini dengan "o" untuk datetimes style "xml"
JohnOpincar