Apa itu perintah standar untuk mencetak tanggal dalam format RFC-3339?

19

The dateperintah tidak menawarkan hal seperti itu, yang merupakan jenis sedih karena RFC-3339 adalah modern, luas, format waras digunakan di mana-mana (kecuali dalam email yang modern maupun waras).

Offset zona waktu saya saat ini -08: 00 sehingga bentuk paling sederhana dari perintah ini harus mencetak waktu saat ini sebagai 2013-09-05T14:58:33.102-08:00.

Martin Jambon
sumber
Standar manakah yang Anda minati?
Stéphane Chazelas
Saya pribadi baik-baik saja dengan GNU tetapi dalam skema besar hal-hal itu seharusnya lebih luas dari itu. Ini juga harus datang dengan default yang masuk akal (opsi pendek, presisi milidetik) dan memiliki cara untuk menentukan presisi subsecond (jumlah digit selain 0 atau 9).
Martin Jambon
1
Ini bukan format yang waras: tidak adanya spasi sama sekali membuat sulit bagi manusia untuk membaca. Anda harus menggunakan sedikit variasi 2013-09-05 14:58:33.102 -0800kecuali ketika ada beberapa alasan mengapa spasi tidak boleh digunakan sama sekali.
zwol
1
Saya membandingkannya dengan format tanggal surat (RFC 822, 2822) yang sulit dibaca untuk manusia dan mesin.
Martin Jambon

Jawaban:

30

Sepertinya Anda dapat melakukan beberapa format menggunakan saklar ke implementasi GNU date(versi 5.90 atau lebih tinggi) --rfc3339=,.

Contohnya

$ 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

Jika Anda ingin Tditambahkan, sebagai peretasan:

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

Jika Anda menginginkannya dalam milidetik:

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

Referensi

slm
sumber
7
Saat ini, tidak diperlukan retasan untuk mendapatkan 'T'. The --iso-8601' option accepts the same arguments as --rfc-3339`, dan termasuk 'T' dalam output.
Ti Strga
1
Bagian sed s/\(\....\).*-/\1-/gseharusnya s/\(\....\).*\([+-]\)/\1\2/gjuga bekerja di timur Atlantik.
svante
1
@svante - terima kasih atas detailnya, diperbaiki.
slm
2
@Eonil yang sebenarnya tidak benar, RFC3339 menyatakan: NOTE: ISO 8601 defines date and time separated by "T".Sementara RFC3339 memungkinkan Anda untuk menggunakan spasi. Baca ietf.org/rfc/rfc3339.txt Bagian 5.6
rwenz3l
1
@ rwenz3l Kesalahan saya. Saya baru saja membaca bagian ABNF dan melewatkan catatan. Terima kasih telah menunjukkannya!
Eonil
18

Dengan GNU date(5,90 atau lebih tinggi):

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

Ganti %Ndengan %3Nselama milidetik, %6Nselama mikro-detik ...

AFAIK, tidak satu pun dari spesifikasi POSIX, Unix atau LSB yang menentukan perintah apa pun yang dapat menampilkan waktu dengan granularity sub-detik, tetapi bagian fraksional adalah opsional dalam RFC 3339.

POSIX / Unix / LSB strftime mendukung %zuntuk menampilkan TZ offset -0800, sehingga yang paling portabel yang mungkin Anda dapatkan adalah:

 $ 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
Stéphane Chazelas
sumber
8

GNU datememiliki format ISO-8601 bawaan - bukankah itu cukup dekat atau bahkan identik dengan RFC-3339?

1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600
Bruce Ediger
sumber
ISO-8601 memungkinkan pemformatan tanggal dan waktu yang berbeda, tetapi saya pikir OP meminta secara spesifik untuk format Tanggal W3C "Tanggal lengkap ditambah jam, menit, detik, dan pecahan desimal dari YYYY-MM-DD yang kedua. Mm: ss.sTZD (mis. 1997-07-16T19: 20: 30.45 + 01: 00) " - Format Tanggal dan Waktu W3C .
hakre
8

Bagaimana dengan yang baik:

$ date +%Y-%m-%dT%T%z
2015-10-29T14:47:06+0200
Eran Chetzroni
sumber
Di mana informasi zona waktu?
Raphael Ahrens
Ini berfungsi baik di mac dan linux 'date'
Eran Chetzroni
1
Bagaimana dengan milidetik?
Martin Jambon
6
catatan cepat di sini, tanpa membuka RFC, segmen zona waktu, 0200kehilangan titik dua, yang dapat merusak beberapa sistem yang membutuhkannya.
Mike Mackintosh
2
Catatan MikeMackintosh relevan; output yang ditampilkan di sini bukan tanggal RFC 3339 yang sah. Kolon di segmen zona waktu diperlukan untuk RFC 3339; lihat definisi time-numoffsetdi tools.ietf.org/html/rfc3339#s-5-5 .
Mark Amery
7

Anda juga dapat memformat waktu sesuai dengan RFC3339 (ISO8601) lebih mudah:

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

CATATAN: Format ini juga digunakan dalam Label Schema Convention RC 1.0

Daniel Andrei Mincă
sumber
Itu bukan RFC3339 yang valid. Jawaban Eran tentang `` `tanggal +% Y-% m-% dT% T% z` `` benar dan lebih sedikit karakter. Jika Anda ingin di UTC pass -u flag, yang akan nol di luar zona waktu.
briceburg
Dengan -ubenderanya, jawaban ini benar, bukan?
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'

Perintah-perintah ini kompatibel dengan POSIX, dengan pengecualian %zspesifikasi konversi. Namun, %zsecara luas didukung dan bekerja dengan cara yang sama di Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix dan Haiku. Ini juga bekerja dengan alat-alat di Busybox, Toybox dan sbase (utilitas sistem dasar suckless.org). Karena %zmenampilkan offset zona waktu dalam ±HHMMformat, kami membutuhkan sedpipa untuk menambahkan titik dua dan mengubahnya ±HH:MM.

CATATAN: Perintah proyek Heirloom datememiliki %zkeluaran yang tidak kompatibel : tidak mencetak +tanda.

Lassi
sumber