ओएस एक्स पर `डेट` कमांड में आईएसओ 8601` -आई` विकल्प नहीं है?


193

बैश स्क्रिप्ट में, मैं आईएसओ 8601 प्रारूप (अधिमानतः यूटीसी) में वर्तमान डेटाटाइम प्रिंट करना चाहता हूं , और ऐसा लगता है कि यह उतना ही सरल होना चाहिए date -I:

http://ss64.com/bash/date.html

लेकिन यह मेरे मैक पर काम नहीं करता है:

$ date -I
date: illegal option -- I
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

और वास्तव में, man dateइस विकल्प को सूचीबद्ध नहीं करता है।

किसी को पता है कि यह क्यों है, या मेरे लिए किसी भी अन्य (आसान) तरीके से आईएसओ 8601 प्रारूप में तारीख प्रिंट कर सकते हैं? धन्यवाद!


2
स्पष्ट करने के लिए, मुझे समय सहित पूर्ण आईएसओ 8601 तारीख चाहिए, और अधिमानतः यूटीसी समयक्षेत्र में।
असेम किशोर

प्रश्न को संपादित करना बेहतर है। आप किस प्रारूप में समय चाहते हैं?
टॉम ज़िक

@ टॉम: ठीक है, संपादित किया गया। प्रारूप के अनुसार, आईएसओ 8601 पर्याप्त विशिष्ट नहीं है?
असेम किशोर

नहीं, आईएसओ 8601 पर्याप्त विशिष्ट नहीं है। यह मानक कई प्रकार के स्वरूपों के कई स्वरूपों को निर्दिष्ट करता है। दोनों 2011-08-27और 2011-08-27T18:55:43Zआईएसओ 8601 स्वरूप हैं। और वास्तव में, प्रश्न को संपादित करना अधिक सहायक होगा जो कई टिप्पणियों में अपडेट को स्कैन कर रहा है। जो आप प्रिंट करने का प्रयास कर रहे हैं उसका एक उदाहरण आदर्श होगा।
कीथ थॉम्पसन

6
स्थापित GNU कोरुटिल्स का उपयोग करके brew(जो उपसर्ग 'g' का उपयोग करता है) gdate -Iने अन्य GNU झंडों के साथ काम किया।
जोएल पुर्रा

जवाबों:


348

आप उपयोग कर सकते हैं

date "+%Y-%m-%d"

या पूरी तरह से ISO-8601 अनुरूप तारीख के लिए , निम्न में से एक प्रारूप का उपयोग करें:

date -u +"%Y-%m-%dT%H:%M:%SZ"

आउटपुट:

2011-08-27T23:22:37Z

या

date +%Y-%m-%dT%H:%M:%S%z

आउटपुट:

2011-08-27T15:22:37-0800

7
तकनीकी रूप से, "T" की सिफारिश की गई है लेकिन ISO 8601 में वैकल्पिक है। 'T' की जगह एक स्पेस का उपयोग करना होगा: date -u + "% Y-% m-% d-% H-% M-% SZ"
बेसिल बोर्क

आखिरकार! मैंने इसे अपने bash_alias
क्रिश्चियन

हाँ, भयानक जवाब धन्यवाद!, लेकिन यह date -u +"%Y-%m-%dT%H:%MZ"वास्तव में मैं देख रहा था।
चीकूमीकु

3
@mbigras: Zऔर +00:00समान (अधिकतर) हैं। अनुवाद के समय के प्रयोजनों के लिए, वे दोनों का मतलब UTC है। हालाँकि इंग्लैंड +00:00सर्दियों में और +01:00गर्मियों में (BST) है।
जेफरी हॉल्टन

5
@JeffreyHulten: "वे दोनों का मतलब UTC है" - Nitpick, लेकिन ZUTC है, जबकि +00:00GMT है। यूटीसी एक टाइमज़ोन नहीं है और इसमें एक ऑफसेट नहीं है; ऑफसेट को एक टाइमज़ोन और यूटीसी के बीच के समय के अंतर के रूप में परिभाषित किया जाता है, समय मापन का मानक। GMT +00: 00 UTC से निकाला गया है (और BST है, जैसा कि आप कहते हैं, +01: 00 UTC से हटा दिया गया है)।
अमदन

57

जीएनयू तारीख में date -Iरूप में ही है date +%F, और -Isecondsऔर -Iminutesभी समय शामिल यूटीसी के साथ ऑफसेट।

$ date +%F # -I or +%Y-%m-%d
2013-05-03
$ date +%FT%T%z # -Iseconds or +%Y-%m-%dT%H:%M:%S%z
2013-05-03T15:59:24+0300
$ date +%FT%H:%M # -Iminutes or +%Y-%m-%dT%H:%M%z
2013-05-03T15:59+0300

-uकी तरह है TZ=UTC+00:00से बदला जा सकता है Z

$ date -u +%FT%TZ
2013-05-03T12:59:24Z

ये भी मान्य आईएसओ 8601 तिथि या समय प्रारूप हैं:

20130503T15 (%Y%m%dT%M)
2013-05 (%Y%m)
2013-W18 (%Y-W%V)
2013-W18-5 (%Y-W%V-%u)
2013W185 (%YW%V%u)
2013-123 (%Y-%j, ordinal date)
2013 (%Y)
1559 (%H%M)
15 (%H)
15:59:24+03 (UTC offset doesn't have to include minutes)

ये नहीं हैं:

2013-05-03 15:59 (T is required in the extended format)
201305 (it could be confused with the YYMMDD format)
20130503T15:59 (basic and exteded formats can't be mixed)

3
+ "% FT% T% z" के लिए हुर्रे जो वास्तव में मेरी ज़रूरत थी
नूह येटर

22

एक छोटा विकल्प जो GNU और BSD तिथि दोनों पर काम करता है:

date -u +%FT%T%z

7
या date -u +%FT%TZयूटीसी ऑफसेट के कारण वैसे भी शून्य होगा
akostadinov

15

Coreutils पैकेज GNU संस्करणों को उपकरण प्रदान करता है। स्थापित करने के लिए:

$ brew install coreutils

आप देख सकते हैं कि क्या प्रदान किया गया है:

$ brew list coreutils

सूचना यह तारीख के साथ आता है:

$ brew list coreutils | grep date

यह मानक GNU दिनांक कमांड है, इसलिए यह -I स्विच लेगा:

$ gdate -I
2016-08-09

1
या:: gdate --iso-8601=ns2016-09-29T16: 54: 23,485230000 + 02: 00
ओलिवियर

5

बस सामान्य dateस्वरूपण विकल्पों का उपयोग करें:

date '+%Y-%m-%d'

संपादित करें: समय और UTC शामिल करने के लिए, ये समतुल्य हैं:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'

अपने ओपी को एक टिप्पणी जोड़ते हुए स्पष्ट किया कि मैं पूरी तारीख चाहता हूं, जिसमें समय भी शामिल है, और यूटीसी टाइमजोन में भी। हालांकि टिप के लिए धन्यवाद!
असेम किशोर

3

यह बैश की विशेषता नहीं है, यह dateबाइनरी की विशेषता है । लिनक्स पर आपके पास आमतौर पर GNU कोरुटिल्स संस्करण होता है date, जबकि OSX पर आपके पास BSD विरासत उपयोगिताओं होगी। जीएनयू संस्करण को निश्चित रूप से एक वैकल्पिक पैकेज के रूप में स्थापित किया जा सकता है, या आप अपने स्वयं के प्रतिस्थापन को रोल कर सकते हैं - मेरा मानना ​​है कि यह पर्ल में एक साधारण एक-लाइनर होना चाहिए।


दिलचस्प है, धन्यवाद। मैं मैक / लिनक्स / यूनिक्स / बैश नोब की तरह हूं; क्या आप कोरुटिल्स पर विस्तृत रूप से विचार करेंगे और मैक पर इसे कैसे स्थापित करें? धन्यवाद!
असेम किशोर

2

अन्य उत्तरों को एक कदम आगे ले जाते हुए, आप तिथि -Iध्वज जोड़ने के लिए अपने ~ / .bashrc या ~ / .shshrc पर एक फ़ंक्शन जोड़ सकते हैं :

date() {
  if [ "$1" = "-I" ]; then
    command date "+%Y-%m-%dT%H:%M:%S%z"
  else
  command date "$@"
  fi
}

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