วิธีการจัดรูปแบบ DateTime ใน PowerShell


156

ฉันสามารถจัดรูปแบบGet-Datecmdlet ไม่มีปัญหาเช่นนี้:

$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

คำตอบ:



26

ตอบคำถามแล้ว แต่มีข้อมูลหายไป:

ตัวแปรกับ Cmdlet

คุณมีค่าใน$Dateตัวแปรและผู้ประกอบการทำงานในรูปแบบนี้-f 'format string' -f valuesถ้าคุณโทรหาGet-Date -format "yyyyMMdd"คุณเรียกcmdletด้วยพารามิเตอร์บางอย่าง ค่า "yyyyMMdd" คือค่าสำหรับพารามิเตอร์Format(ลองhelp Get-Date -param Format)

-f ผู้ประกอบการ

มีสตริงรูปแบบมากมาย ดูอย่างน้อยpart1และpart2 string.Format('format string', values')ใช้เธอ คิดว่ามันเป็น'format-string' -f valuesเพราะ-fผู้ประกอบการทำงานได้เป็นอย่างในทำนองเดียวกันเป็นstring.Formatวิธีการ (แม้ว่าจะมีความแตกต่างบาง (หาข้อมูลเพิ่มเติมดูข้อมูลที่คำถามที่กองมากเกิน: วิธีว่า ? ไม่ RHS ของการทำงานของผู้ประกอบการของ PowerShell -f )


3
สิ่งที่เขาพูดคือพารามิเตอร์ -Format ทำให้ Get-DateTime ส่งคืนสตริงไม่ใช่วัตถุ DateTime ดังนั้นตัวแปร $ Date ของคุณจึงไม่สามารถจัดรูปแบบได้ตามที่คาดไว้ ฉันหวังว่าพารามิเตอร์ -Format จะเปลี่ยนพฤติกรรมเริ่มต้นของวิธี ToString ของวัตถุ DateTime โดยเฉพาะอย่างยิ่ง จากนั้นมันจะทำงานตามที่คุณคาดไว้
Nathan Hartley


18

สะดวกมาก - แต่มันอาจจะไม่ได้ทั้งหมดที่มีประสิทธิภาพอีกด้วย - การแก้ปัญหาคือการใช้ฟังก์ชั่นสมาชิกGetDateTimeFormats(),

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

สิ่งนี้จะส่งออกอาเรย์สตริงขนาดใหญ่ของรูปแบบการจัดรูปแบบสำหรับค่าวันที่ จากนั้นคุณสามารถเลือกหนึ่งในองค์ประกอบของอาร์เรย์ผ่าน[]-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")ส่งผลให้ชนิดของวัตถุที่แตกต่างจากวัตถุ datetime ลองเล่นกับสิ่งนี้$dateStr = [datetime](Get-Date $date -Format "yyyMMdd") คุณจะเห็นความแตกต่างทันที
เจมี่มาร์แชลล์

1
ใช่ .. มันเป็นสตริงนั่นเป็นเหตุผลที่ฉันตั้งชื่อมันว่า dateStr .. :) OP พยายามจัดรูปแบบวัตถุวันที่ให้เป็นสตริง
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แต่นี่เป็นคำตอบสั้น ๆ : ในบรรดาตัวเลือกอื่น ๆคุณมี3 ตัวเลือกง่าย ๆในการจัดรูปแบบ [System.DateTime] ที่เก็บไว้ในตัวแปร:

  1. ส่งผ่านตัวแปรไปยังcmdlet รับวันที่ : 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"
4991
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.