Lệnh `date` trên OS X không có tùy chọn` 86I`?


193

Trong tập lệnh Bash, tôi muốn in datetime hiện tại ở định dạng ISO 8601 (tốt nhất là UTC) và có vẻ như điều này sẽ đơn giản như date -I:

http://ss64.com/bash/date.html

Nhưng điều này dường như không hoạt động trên máy Mac của tôi:

$ date -I
date: illegal option -- I
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

Và thực tế, man datekhông liệt kê tùy chọn này.

Bất cứ ai cũng biết tại sao điều này là, hoặc bất kỳ cách (dễ dàng) nào khác để tôi in ngày ở định dạng ISO 8601? Cảm ơn!


2
Để làm rõ, tôi muốn có một ngày ISO 8601 đầy đủ, bao gồm cả thời gian và tốt nhất là theo múi giờ UTC.
Aseem Kishore

Tốt hơn là chỉ cần chỉnh sửa câu hỏi. Định dạng nào bạn muốn thời gian trong?
Tom Zych

@Tom: được rồi, chỉnh sửa. Theo định dạng, ISO 8601 không đủ cụ thể?
Aseem Kishore

Không, ISO 8601 không đủ cụ thể. Tiêu chuẩn đó quy định một số định dạng của các quy tắc khác nhau. Cả hai 2011-08-272011-08-27T18:55:43Zlà định dạng ISO 8601. Và thực sự, chỉnh sửa câu hỏi sẽ hữu ích hơn khi quét cập nhật qua một số bình luận. Một ví dụ về những gì bạn đang cố gắng in sẽ là lý tưởng.
Keith Thompson

6
Việc cài đặt GNU coreutils bằng cách sử dụng brew(sử dụng tiền tố 'g') gdate -Iđã hoạt động cùng với các cờ GNU khác.
Joel Purra 17/12/13

Câu trả lời:


348

Bạn đã có thể sử dụng

date "+%Y-%m-%d"

Hoặc đối với ngày tuân thủ đầy đủ ISO-8601 , hãy sử dụng một trong các định dạng sau:

date -u +"%Y-%m-%dT%H:%M:%SZ"

Đầu ra:

2011-08-27T23:22:37Z

hoặc là

date +%Y-%m-%dT%H:%M:%S%z

Đầu ra:

2011-08-27T15:22:37-0800

7
Về mặt kỹ thuật, "T" được khuyến nghị nhưng không bắt buộc trong ISO 8601. Sử dụng khoảng trắng thay vì 'T' sẽ là: ngày -u + "% Y-% m-% d% H-% M-% SZ"
Basil Bourque

Cuối cùng! Tôi đã thêm cái này vào bash_alias của mình
Christian Bongiorno

Yup, câu trả lời tuyệt vời Cảm ơn!, Nhưng điều này date -u +"%Y-%m-%dT%H:%MZ"chính xác là tôi đang tìm kiếm.
ChikuMiku

3
@mbigras: Z+00:00giống nhau (chủ yếu). Đối với mục đích dịch thời gian, cả hai đều có nghĩa là UTC. Tuy nhiên, nước Anh đang +00:00vào mùa đông và +01:00mùa hè (BST).
Jeffrey Hulten

5
@JeffreyHulten: "cả hai đều có nghĩa là UTC" - Nitpick, nhưng Zlà UTC, trong khi +00:00là GMT. UTC không phải là múi giờ và không có phần bù; offset được định nghĩa là chênh lệch thời gian giữa múi giờ và UTC, tiêu chuẩn đo thời gian. GMT là EST: 00 bị xóa khỏi UTC (và BST là, như bạn nói, +01: 00 bị xóa khỏi UTC).
Amadan

57

Trong ngày GNU date -Icũng giống như date +%F, và -Iseconds-Iminutescũng bao gồm thời gian với UTC bù đắp.

$ date +%F # -I or +%Y-%m-%d
2013-05-03
$ date +%FT%T%z # -Iseconds or +%Y-%m-%dT%H:%M:%S%z
2013-05-03T15:59:24+0300
$ date +%FT%H:%M # -Iminutes or +%Y-%m-%dT%H:%M%z
2013-05-03T15:59+0300

-ucũng giống như TZ=UTC. +00:00có thể được thay thế bằng Z.

$ date -u +%FT%TZ
2013-05-03T12:59:24Z

Đây cũng là các định dạng ngày hoặc thời gian ISO 8601 hợp lệ:

20130503T15 (%Y%m%dT%M)
2013-05 (%Y%m)
2013-W18 (%Y-W%V)
2013-W18-5 (%Y-W%V-%u)
2013W185 (%YW%V%u)
2013-123 (%Y-%j, ordinal date)
2013 (%Y)
1559 (%H%M)
15 (%H)
15:59:24+03 (UTC offset doesn't have to include minutes)

Đây không phải là:

2013-05-03 15:59 (T is required in the extended format)
201305 (it could be confused with the YYMMDD format)
20130503T15:59 (basic and exteded formats can't be mixed)

3
hooray cho + "% FT% T% z" đó chính xác là những gì tôi cần
Noah Yetter

22

Một thay thế ngắn hoạt động vào cả ngày GNU và BSD là:

date -u +%FT%T%z

7
hoặc date -u +%FT%TZbởi vì trong bù UTC dù sao cũng sẽ bằng không
akostadinov

15

Gói coreutils cung cấp các phiên bản GNU của các công cụ. Để cài đặt:

$ brew install coreutils

Bạn có thể thấy những gì được cung cấp:

$ brew list coreutils

Lưu ý rằng nó đi kèm với ngày:

$ brew list coreutils | grep date

Đây là lệnh ngày GNU tiêu chuẩn, do đó, nó sẽ thực hiện chuyển đổi -I:

$ gdate -I
2016-08-09

1
Hoặc :: gdate --iso-8601=ns2016-09-29T16: 54: 23,485230000 + 02: 00
Olivier

5

Chỉ cần sử dụng các datetùy chọn định dạng bình thường :

date '+%Y-%m-%d'

Chỉnh sửa: để bao gồm thời gian và UTC, đây là tương đương:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'

Đã thêm một nhận xét vào OP của tôi làm rõ rằng tôi muốn ngày đầy đủ, bao gồm cả thời gian và tốt nhất là theo múi giờ UTC. Cảm ơn các mẹo mặc dù!
Aseem Kishore

3

Nó không phải là một tính năng của Bash, nó là một tính năng của datenhị phân. Trên Linux, bạn thường có phiên bản GNU coreutils date, trong khi trên OSX, bạn sẽ có các tiện ích kế thừa BSD. Phiên bản GNU chắc chắn có thể được cài đặt như một gói tùy chọn hoặc bạn có thể tự thay thế - tôi tin rằng nó phải là một lớp lót đơn giản, ví dụ như trong Perl.


Thú vị, cảm ơn. Tôi thuộc loại Mac / Linux / Unix / Bash noob; bạn có phiền khi xây dựng trên coreutils và cách cài đặt nó trên Mac không? Cảm ơn!
Aseem Kishore

2

Đưa các câu trả lời khác tiến thêm một bước, bạn có thể thêm một hàm vào ~ / .bashrc hoặc ~ / .zshrc để thêm -Icờ ngày :

date() {
  if [ "$1" = "-I" ]; then
    command date "+%Y-%m-%dT%H:%M:%S%z"
  else
  command date "$@"
  fi
}

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.