RFC-3339 formatında tarih yazdırmak için standart komut nedir?


19

dateKomut RFC 3339 (ne modern ne de aklı başında olan e-postada hariç) her yerde kullanılan modern, yaygın, aklı başında biçimidir beri tür üzücü taşımaktadır böyle bir şey, sunmamaktadır.

Saat dilimim şu anda -08: 00 olduğundan, bu komutun en basit şekli geçerli saati şu şekilde yazdırmalıdır 2013-09-05T14:58:33.102-08:00.


Hangi standartlarla ilgileniyorsunuz?
Stéphane Chazelas

Ben şahsen GNU ile iyiyim ama büyük şemada gerçekten bundan daha geniş olmalı. Ayrıca makul bir varsayılan (kısa seçenek, milisaniye hassasiyet) ile gelmeli ve ikinci hassasiyeti (0 veya 9 dışındaki basamak sayısı) belirtmenin bir yoluna sahip olmalıdır.
Martin Jambon

1
Bu aklı başında bir format değil : boşlukların tamamen yokluğu, insanların okumasını gereksiz yere zorlaştırıyor. 2013-09-05 14:58:33.102 -0800Boşlukların hiç kullanılmaması için bir neden olduğu durumlar dışında hafif bir varyasyon kullanmalısınız .
Mart'ta zwol

1
Hem insanlar hem de makineler için okunması zor olan posta tarih formatıyla (RFC 822, 2822) karşılaştırıyordum.
Martin Jambon

Yanıtlar:


30

Görünüşe göre GNU uygulamasının date(sürüm 5.90 veya üstü) anahtarını kullanarak çeşitli formatlar yapabilirsiniz --rfc3339=.

Örnekler

$ 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

TBir hack olarak eklenmesini istiyorsanız :

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

Milisaniye cinsinden isterseniz:

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

Referanslar


7
Bu günlerde, 'T' almak için kesmek gerekmez. --iso-8601' option accepts the same arguments as --Rfc-3339` ve kendi çıkışı olarak 'T' içerir.
Ti Strga

1
Sed kısmı Atlantik'in doğusunda da çalışmak s/\(\....\).*-/\1-/golmalıdır s/\(\....\).*\([+-]\)/\1\2/g.
svante

1
@svante - detay için teşekkürler, düzeltildi.
slm

2
@Eonil aslında doğru değil, RFC3339 şunu belirtir: NOTE: ISO 8601 defines date and time separated by "T".RFC3339 bunun yerine bir boşluk kullanmanıza izin verir. Oku ietf.org/rfc/rfc3339.txt Bölüm 5.6
rwenz3l

1
@ rwenz3l Benim hatam. Sadece ABNF bölümünü okudum ve notları kaçırdım. Gösterdiğiniz için teşekkürler!
Eonil

18

GNU ile date(5.90 veya üstü):

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

Milisaniye, mikro saniye için %Nile değiştirin ...%3N%6N

AFAIK, POSIX, Unix veya LSB özelliklerinin hiçbiri, saniyelerin altında ikinci ayrıntı düzeyine sahip zamanları görüntüleyebilecek herhangi bir komut belirtmez, ancak kesirli kısım RFC 3339'da isteğe bağlıdır.

POSIX / Unix / LSB strftime destekleri %zTZ göstermek için o kadar ofset -0800muhtemelen almak için gidiyoruz en taşınabilir, böylece:

 $ 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 date, yerleşik ISO-8601 formatına sahiptir - RFC-3339'a oldukça yakın veya hatta bu kadar önemli değil mi?

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

ISO-8601 farklı tarih ve saat biçimlendirmelerine izin verir, ancak OP özellikle W3C Tarih biçimi "Tam tarih artı saat, dakika, saniye ve ikinci bir YYYY-AA-GG ondalık kesir istiyor. (örn. 1997-07-16T19: 20: 30.45 + 01: 00) " - W3C Tarih ve Saat Biçimleri .
hakre

8

İyi eski hakkında:

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

Saat dilimi bilgileri nerede?
Raphael Ahrens

Bu hem mac hem de linux 'date' için çalışıyor
Eran Chetzroni

1
Milisaniyeye ne dersiniz?
Martin Jambon

6
Hızlı not, RFC'yi açmadan, saat dilimi segmenti, 0200onu gerektiren bazı sistemleri kırabilecek bir iki nokta noktasını eksiktir.
Mike Mackintosh

2
@ MikeMackintosh'un notu uygundur; Burada gösterilen çıkışı olmayan hukuki bir RFC 3339 tarihi. Saat dilimi segmentindeki kolon RFC 3339 için gereklidir; bkz time-numoffset. tools.ietf.org/html/rfc3339#section-5.6 .
Mark Amery


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'

Bu komutlar, %zdönüştürme özelliği dışında POSIX uyumludur . Ancak, %zLinux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix ve Haiku'da da yaygın olarak desteklenir ve aynı şekilde çalışır. Ayrıca Busybox, Toybox ve sbase'deki (suckless.org temel sistem yardımcı programları) araçlarla da çalışır. Yana %zçıkışlar saat diliminde offset ±HHMMformatta, ihtiyacımız sediki nokta üst üste eklemek ve bunu değiştirmek için boru ±HH:MM.

NOT: Heirloom projesinin datekomutunun %zçıktısı uyumsuz : bir +işaret yazdırmıyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.