RFC-3339 प्रारूप में एक तारीख छापने के लिए एक मानक कमांड क्या है?


19

dateआदेश में इस तरह बात है, जो दुख की बात की तरह है, क्योंकि RFC-3339 आधुनिक, बड़े पैमाने पर, समझदार (ईमेल जो न तो आधुनिक है और न ही समझदार है को छोड़कर) हर जगह इस्तेमाल किया प्रारूप है प्रदान नहीं करता है।

मेरा समय क्षेत्र ऑफसेट वर्तमान में -08: 00 है, इसलिए इस कमांड का सबसे सरल रूप वर्तमान समय को प्रिंट करना चाहिए 2013-09-05T14:58:33.102-08:00


आप किस मानक (ओं) में रुचि रखते हैं?
स्टीफन चेजलस

मैं व्यक्तिगत रूप से जीएनयू के साथ ठीक हूं लेकिन चीजों की भव्य योजना में यह वास्तव में उससे अधिक व्यापक होना चाहिए। यह एक उचित डिफ़ॉल्ट (लघु विकल्प, मिलीसेकंड परिशुद्धता) के साथ भी आना चाहिए और इसके पास उप-सटीक (0 या 9 के अलावा अन्य अंकों की संख्या) निर्दिष्ट करने का एक तरीका है।
मार्टिन जाम्बोन

1
यह एक समझदार प्रारूप नहीं है: व्हॉट्सएप की कुल अनुपस्थिति इसे मनुष्यों को पढ़ने के लिए अनावश्यक रूप से कठिन बना देती है। आपको थोड़ी भिन्नता का उपयोग करना चाहिए 2013-09-05 14:58:33.102 -0800जब कुछ कारण है कि रिक्त स्थान का उपयोग बिल्कुल नहीं किया जाना चाहिए।
२०'१४ zwol

1
मैं इसकी तुलना मेल डेट फॉर्मेट (RFC 822, 2822) से कर रहा था, जो इंसानों और मशीनों दोनों के लिए पढ़ना मुश्किल है।
मार्टिन जाम्बोन

जवाबों:


30

ऐसा लगता है कि आप में से जीएनयू कार्यान्वयन के लिए स्विच का उपयोग कई प्रारूपों कर सकते हैं date, (संस्करण 5.90 या इससे अधिक) --rfc3339=

उदाहरण

$ 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

यदि आप Tहैक के रूप में जोड़ा जाना चाहते हैं :

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

यदि आप इसे मिलीसेकंड में चाहते हैं:

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

संदर्भ


7
इन दिनों 'टी' पाने के लिए किसी हैक की जरूरत नहीं है। --iso-8601' option accepts the same arguments as --Rfc-3339`, और इसके उत्पादन में 'टी' भी शामिल है।
Ti Strga

1
सेड का हिस्सा अटलांटिक के पूर्व में भी s/\(\....\).*-/\1-/gहोना चाहिए s/\(\....\).*\([+-]\)/\1\2/g
svante

1
@svante - विस्तार के लिए धन्यवाद, निश्चित।
slm

2
@Eonil जो वास्तव में सही नहीं है, RFC3339 कहता है: NOTE: ISO 8601 defines date and time separated by "T".जबकि RFC3339 आपको इसके स्थान का उपयोग करने की अनुमति देता है। Ietf.org/rfc/rfc3339.txt सेक्शन 5.6
rwenz3l

1
@ rwenz3l मेरी गलती है। मैं सिर्फ एबीएनएफ हिस्सा पढ़ता हूं और नोट्स याद करता हूं। इस पर ध्यान दिलाने के लिए धन्यवाद!
Eonil

18

GNU date(5.90 या अधिक) के साथ:

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

माइक्रो सेकंड के लिए मिलीसेकंड के %Nसाथ बदलें ...%3N%6N

AFAIK, पोसिक्स, यूनिक्स या एलएसबी विनिर्देशों में से कोई भी उप-द्वितीय ग्रैन्युलैरिटी के साथ बार प्रदर्शित कर सकने वाले किसी भी आदेश को निर्दिष्ट करता है, लेकिन आंशिक भाग RFC 3339 में वैकल्पिक है।

POSIX / Unix / LSB स्ट्रैपटाइम , जैसे कि आप प्राप्त करने जा रहे सबसे पोर्टेबल है, %zको TZ ऑफसेट प्रदर्शित करने का समर्थन करता -0800है:

 $ 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में ISO-8601 प्रारूप बनाया गया है - जो RFC-3339 के काफी करीब या समान नहीं है?

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

ISO-8601 तारीखों और समय के विभिन्न स्वरूपों की अनुमति देता है, लेकिन मुझे लगता है कि OP विशेष रूप से W3C दिनांक प्रारूप के लिए पूछ रहा है "पूर्ण तिथि प्लस घंटे, मिनट, सेकंड और एक दूसरे YYYY-MM-DDThh का एक दशमलव अंश:": ss.sTZD (उदाहरण 1997-07-16T19: 20: 30.45 + 01: 00) " - W3C दिनांक और समय प्रारूप
हक्रे

8

कैसे अच्छे पुराने के बारे में:

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

समय क्षेत्र की जानकारी कहाँ है?
राफेल अहरेंस

यह मैक और लिनक्स 'तारीख' पर दोनों काम करता है
एरन चेत्ज्रोनी

1
मिलीसेकंड के बारे में कैसे?
मार्टिन जंबोन

6
त्वरित नोट यहाँ, RFC को खोले बिना, टाइमज़ोन खंड, 0200एक बृहदान्त्र को याद कर रहा है, जो कुछ प्रणालियों को तोड़ सकता है जिनके लिए इसकी आवश्यकता होती है।
माइक मैकिनटोश

2
@ माइकमैकिंटोश का नोट प्रासंगिक है; उत्पादन यहाँ दिखाया गया है नहीं एक कानूनी आरएफसी 3339 की तारीख। RFC 3339 के लिए टाइमज़ोन खंड में बृहदान्त्र आवश्यक है; tools.ietf.org/html/rfc3339#section-5.6time-numoffset पर परिभाषा देखें ।
मार्क अमेरी

7

आप RFC3339 (ISO8601) के अनुसार समय को आसानी से प्रारूपित कर सकते हैं :

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

नोट: इस प्रारूप का उपयोग लेबल स्कीमा कन्वेंशन RC 1.0 में भी किया जाता है


यह एक मान्य RFC3339 नहीं है। एरण का `` तिथि +% Y-% m-% dT% T% z `` `का उत्तर सही और कम वर्ण है। यदि आप यूटीसी पास-यू ध्वज चाहते हैं, जो टाइमज़ोन ऑफसेट को शून्य कर देगा।
ब्रिसबर्ग

-uझंडे के साथ यह उत्तर सही है, है ना?
लस्सी

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'

ये आदेश %zरूपांतरण विनिर्देश के अपवाद के साथ, POSIX- संगत हैं । हालांकि, %zव्यापक रूप से समर्थित है और लिनक्स, मैकओएस, फ्रीबीएसडी, ओपनबीएसडी, नेटबीएसडी, ड्रैगनफ्लीबीएसडी, सोलारिस, मिनिक्स और हाइकू में इसी तरह काम करता है। यह बिजीबॉक्स, टॉयबॉक्स और sbase (suckless.org बेस सिस्टम यूटिलिटीज) में टूल्स के साथ भी काम करता है। चूंकि %zसमय-समय पर ±HHMMप्रारूप में ऑफसेट का उत्पादन होता है, इसलिए हमें sedएक बृहदान्त्र को जोड़ने और इसे बदलने के लिए पाइप की आवश्यकता होती है ±HH:MM

नोट: हिरलूम परियोजना के dateकमांड में असंगत %zआउटपुट है: यह एक +संकेत नहीं छापता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.