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.