Lệnh tiêu chuẩn để in ngày ở định dạng RFC-3339 là gì?


17

Các datelệnh không cung cấp điều như vậy, đó là loại buồn kể từ RFC-3339 là hiện đại rộng rãi định dạng,, lành mạnh sử dụng ở khắp mọi nơi (trừ trong email mà không phải là hiện đại cũng không lành mạnh).

Độ lệch múi giờ của tôi hiện là -08: 00 vì vậy dạng đơn giản nhất của lệnh này sẽ in thời gian hiện tại là 2013-09-05T14:58:33.102-08:00.


Những tiêu chuẩn nào bạn quan tâm?
Stéphane Chazelas

Cá nhân tôi vẫn ổn với GNU nhưng trong sơ đồ lớn của mọi thứ, nó thực sự nên rộng hơn thế. Nó cũng phải đi kèm với một mặc định hợp lý (tùy chọn ngắn, độ chính xác mili giây) và có cách chỉ định độ chính xác của giây (số chữ số khác 0 hoặc 9).
Martin Jambon

1
Đây không phải là một định dạng lành mạnh: sự vắng mặt hoàn toàn của khoảng trắng khiến con người khó đọc một cách không cần thiết. Bạn nên sử dụng biến thể nhẹ 2013-09-05 14:58:33.102 -0800trừ khi có một số lý do tại sao không phải sử dụng khoảng trắng.
zwol

1
Tôi đã so sánh nó với định dạng ngày thư (RFC 822, 2822) khó đọc cho cả người và máy.
Martin Jambon

Câu trả lời:


29

Có vẻ như bạn có thể thực hiện một số định dạng bằng cách sử dụng chuyển sang triển khai GNU date(phiên bản 5.90 trở lên) , --rfc3339=.

Ví dụ

$ date --rfc-3339=date
2014-03-19

$ date --rfc-3339=seconds
2014-03-19 18:00:05-04:00

$ date --rfc-3339=ns
2014-03-19 18:00:08.179780629-04:00

Nếu bạn muốn Tđược thêm vào, dưới dạng hack:

$ date --rfc-3339=seconds | sed 's/ /T/'
2014-03-19T18:35:03-04:00

Nếu bạn muốn nó tính bằng mili giây:

$ date --rfc-3339=ns | sed 's/ /T/; s/\(\....\).*\([+-]\)/\1\2/g'
2014-03-19T18:42:52.362-04:00

Người giới thiệu


7
Ngày nay, không cần hack để có được 'T'. Các --iso-8601' option accepts the same arguments as --rfc-3339`, và bao gồm các 'T' trong sản lượng của nó.
Ti Strga 23/03/2016 lúc

1
Phần sed s/\(\....\).*-/\1-/gnên s/\(\....\).*\([+-]\)/\1\2/gcũng hoạt động ở phía đông Đại Tây Dương.
Svante

1
@svante - cảm ơn vì chi tiết, đã sửa.
slm

2
@Eonil thực sự không đúng, RFC3339 nói: NOTE: ISO 8601 defines date and time separated by "T".Trong khi RFC3339 cho phép bạn sử dụng một khoảng trắng thay thế. Đọc ietf.org/rfc/rfc3339.txt Phần 5.6
rwenz3l

1
@ rwenz3l Lỗi của tôi. Tôi chỉ đọc phần ABNF và bỏ lỡ các ghi chú. Cảm ơn đã chỉ ra điều đó!
Eonil

18

Với GNU date(5,90 trở lên):

$ TZ=America/Anchorage date '+%FT%T.%N%:z'
2014-03-19T14:29:31.041119357-08:00

Thay thế %Nbằng %3Nmili giây, %6Ntrong micro giây ...

AFAIK, không có thông số kỹ thuật POSIX, Unix hoặc LSB nào chỉ định bất kỳ lệnh nào có thể hiển thị thời gian với độ chi tiết phụ thứ hai, nhưng phần phân đoạn là tùy chọn trong RFC 3339.

Các strftime POSIX / Unix / LSB hỗ trợ %zhiển thị offset TZ -0800, do đó, khả năng di động nhất mà bạn có thể sẽ nhận được là:

 $ TZ=America/Anchorage perl -MPOSIX -le '$t = strftime "%Y-%m-%dT%T%z",
   localtime; $t =~ s/..$/:$&/; print $t'
 2014-03-19T14:30:23-08:00

8

GNU datecó định dạng ISO-8601 được tích hợp sẵn - không quá gần hoặc thậm chí không hợp lý với RFC-3339?

1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600

ISO-8601 cho phép định dạng ngày và giờ khác nhau, nhưng tôi nghĩ OP đang yêu cầu cụ thể cho định dạng Ngày của W3C "Hoàn thành ngày cộng với giờ, phút, giây và một phần thập phân của YYYY-MM-DDThh: mm: ss.sTZD (ví dụ: 1997-07-16T19: 20: 30,45 + 01: 00) " - Định dạng ngày và giờ của W3C .
hakre

8

Làm thế nào tốt tuổi:

$ date +%Y-%m-%dT%T%z
2015-10-29T14:47:06+0200

Thông tin múi giờ ở đâu?
Raphael AhDR

Điều này hoạt động cả trên mac và linux 'ngày'
Eran Chetzroni

1
Làm thế nào về mili giây?
Martin Jambon

6
lưu ý nhanh ở đây, mà không mở RFC, phân đoạn múi giờ, 0200thiếu dấu hai chấm, có thể phá vỡ một số hệ thống yêu cầu.
Mike Mackffy

2
Ghi chú của @ MikeMackffy là thích hợp; đầu ra hiển thị ở đây không phải là ngày RFC 3339 hợp pháp. Dấu hai chấm trong phân đoạn múi giờ là bắt buộc đối với RFC 3339; xem định nghĩa của time-numoffsettại tools.ietf.org/html/rfc3339#section-5.6 .
Đánh dấu Amery

7

Bạn cũng có thể định dạng thời gian theo RFC3339 (ISO8601) dễ dàng hơn:

$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2016-11-08T08:52:55Z

LƯU Ý: Định dạng này cũng được sử dụng trong Công ước Lược đồ Nhãn RC 1.0


Đó không phải là một RFC3339 hợp lệ. Câu trả lời của Eran về `` `ngày +% Y-% m-% dT% T% z` `` là chính xác và ít ký tự. Nếu bạn muốn trong cờ UTC pass -u, nó sẽ xóa phần bù múi giờ.
briceburg

Với -ucờ này câu trả lời là đúng, phải không?
Lassi

0
echo "Local date only:"
date '+%Y-%m-%d'
echo
echo "Local date and time:"
date '+%Y-%m-%dT%H:%M:%S%z' | sed 's@^.\{22\}@&:@'
echo
echo "UTC date and time:"
date -u '+%Y-%m-%dT%H:%M:%SZ'

Các lệnh này tương thích với POSIX, ngoại trừ %zthông số kỹ thuật chuyển đổi. Tuy nhiên, %zđược hỗ trợ rộng rãi và hoạt động theo cách tương tự trong Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix và Haiku. Nó cũng hoạt động với các công cụ trong Busybox, Toybox và sbase (các tiện ích hệ thống cơ sở của craless.org). Vì %zđầu ra bù thời gian theo ±HHMMđịnh dạng, chúng tôi cần sedđường ống để thêm dấu hai chấm và thay đổi nó thành ±HH:MM.

LƯU Ý: dateLệnh của dự án Heirloom có %zđầu ra không tương thích : nó không in một +dấu hiệu.

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.