Cách định dạng DateTime trong PowerShell


155

Tôi có thể định dạng Get-Datecmdlet không có vấn đề như thế này:

$date = Get-Date -format "yyyyMMdd"

Nhưng một khi tôi đã có một ngày trong một biến, làm thế nào để tôi định dạng nó? Tuyên bố dưới đây

$dateStr = $date -format "yyyMMdd"

trả về lỗi này:

"Bạn phải cung cấp biểu thức giá trị ở phía bên phải của toán tử '-f'"


3
Tôi thực sự muốn cú pháp này làm việc. $date -format "yyyMMdd"trực quan hơn nhiều để định dạng một đối tượng hơn '{0:yyyyMMdd}' -f $date.
orad

Bên cạnh: PowerShell có một -ftoán tử (với cú pháp như trong câu trả lời được chấp nhận), nhưng không có -formattoán tử nào . Thông báo lỗi phàn nàn về việc ormatkhông phải là toán hạng RHS hợp lệ, nhưng lưu ý rằng các phiên bản PowerShell gần đây thực sự phát ra một thông báo lỗi khác, hữu ích hơn:Unexpected token '-format' in expression or statement
mkuity0

Câu trả lời:


221

Giống như bạn làm trong .NET :

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

Hoặc là:

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

25

Câu hỏi đã được trả lời, nhưng còn thiếu một số thông tin:

Biến so với Cmdlet

Bạn có một giá trị trong $Datebiến và -ftoán tử không hoạt động ở dạng này : 'format string' -f values. Nếu bạn gọi Get-Date -format "yyyyMMdd"bạn gọi một lệnh ghép ngắn với một số tham số. Giá trị "yyyyMMdd" là giá trị cho tham số Format(thử help Get-Date -param Format).

-f nhà điều hành

Có rất nhiều chuỗi định dạng. Nhìn ít nhất vào part1part2 . Cô ấy sử dụng string.Format('format string', values'). Hãy nghĩ về nó như là 'format-string' -f values, bởi vì các -fnhà điều hành hoạt động rất tương tự như string.Formatphương pháp (mặc dù có một số khác biệt (để biết thêm thông tin xem câu hỏi tại Stack Overflow: Làm thế nào một cách chính xác hiện RHS công việc điều hành -f PowerShell không? ).


3
Những gì anh ta đang nói là tham số -Format khiến Get-DateTime trả về một chuỗi, không phải là một đối tượng DateTime. Vì vậy, biến $ Date của bạn không còn có thể được định dạng như mong đợi. Tôi thực sự muốn tham số -Format chỉ đơn giản là thay đổi hành vi mặc định của phương thức ToString của một đối tượng DateTime cụ thể. Sau đó, nó sẽ làm việc như bạn đã mong đợi.
Nathan Hartley

19

Một điều bạn có thể làm là:

$date.ToString("yyyyMMdd")

Cảm ơn tôi đã làm điều này - lỗi cho tôi rằng -format không hoạt động mặc dù.
Ev.

18

Một giải pháp rất tiện lợi - nhưng có lẽ không quá hiệu quả - là sử dụng chức năng thành viên GetDateTimeFormats(),

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

Điều này tạo ra một chuỗi các kiểu định dạng lớn cho giá trị ngày. Sau đó, bạn có thể chọn một trong các phần tử của mảng thông qua []-operator, ví dụ:

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

16

Một cách đơn giản và tốt đẹp là:

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


2
Đây là cách tiếp cận duy nhất không gây ra lỗi biểu hiện có giá trị null cho tôi. Cảm ơn.
Ecker00

7

Làm điều này nếu bạn thực sự cần sử dụng -Formattùy chọn:

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

Tuy nhiên

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

có lẽ hiệu quả hơn .. :)


$dateStr = (Get-Date $date -Format "yyyMMdd")dẫn đến một loại đối tượng khác với một đối tượng datetime. Hãy thử chơi xung quanh với điều này $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") Bạn sẽ thấy sự khác biệt ngay lập tức.
Jamie Marshall

1
Chà, vâng .. Đó là một Chuỗi, đó là lý do tại sao tôi đặt tên cho nó là dateStr .. :) OP đang cố định dạng một đối tượng ngày thành Chuỗi.
tplive

4

Nếu bạn đã đến đây để sử dụng điều này trong cmd.exe(trong một tệp bó):

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

4

Tôi cần thời gian và một chút thay đổi về định dạng. Điều này hoạt động tuyệt vời cho mục đích của tôi:

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

2019-08-16 215757

Theo @ mkuity0 trong các bình luận, điều này sẽ mang lại kết quả tương tự:

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


3

Đối với bất kỳ ai đang cố gắng định dạng ngày hiện tại để sử dụng trong tiêu đề HTTP, hãy sử dụng định dạng "r" (viết tắt của RFC1123) nhưng hãy cẩn thận ...

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

Tức là đừng quên sử dụng "ToUniversalTime ()"


Sử dụng công cụ này với "o" cho kiểu dữ liệu kiểu "xml"
JohnOpincar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.