मैं कमांड लाइन से UNIX टाइमस्टैम्प के लिए प्रारूपित तिथि कैसे प्राप्त कर सकता हूं


59

मेरे पास एक UNIX टाइमस्टैम्प है और मैं dateउस टाइमस्टैम्प के अनुरूप एक प्रारूपित तिथि (जैसे आउटपुट ) प्राप्त करना चाहता हूं ।

मेरा अब तक का प्रयास:

$ date +%s
1282367908
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'

मैं जैसे आउटपुट प्राप्त करने में सक्षम होना चाहता हूं:

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010

जवाबों:


91

Mac OS X और BSD पर:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21

जीएनयू कोर टूल के साथ (आपको उसके लिए जानकारी फ़ाइल के माध्यम से खोदना होगा):

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21

या तो, -u(मानक) विकल्प जोड़ें , या TZ=UTC0UTC की तारीख के लिए एक पर्यावरण चर को पास करें (UTC से एक 0 कहे जाने वाले timezone को TZ=UTC0 परिभाषित करता है, UTCजबकि TZ=UTCबिना किसी ऑफसेट के) के लिए व्यवहार अनिर्दिष्ट है (हालांकि अधिकांश सिस्टम एक को संदर्भित करेगा। सिस्टम-परिभाषित टाइमज़ोन UTCको यूटीसी से ऑफसेट 0 के साथ भी कहा जाता है ))।


1
हालांकि, यह बहुत सारी खुदाई है, जो इस तरह के एक सामान्य कार्य के लिए आश्चर्य की बात है।
डेविड जेड

धन्यवाद, आपका उत्तर स्वीकार कर लिया गया। मुझे info coreutils dateथोड़ा और ध्यान से पढ़ना चाहिए था ।
उमंग

यह मुझे थोड़ी अलग तारीख दे रहा है: date -r 1447264553943परिणाम Wed Dec 28 01:39:03 BRST 47831, जब यह वास्तव में है 11/11/2015, 3:55:53 PM GMT-2:00
18:01 पर

1
@falmp: यदि आप माइक्रोसेकंड के बजाय सेकंड का उपयोग करते हैं तो यह काम करेगा।

@ ऑप्स, वर्ष 47831 होने के साथ पता लगाना चाहिए था, लेकिन यह संख्या इतनी अधिक थी कि मैं इसे याद किया। धन्यवाद!
१२:२५ बजे

6

कुछ गुगली करने के बाद, मुझे इसे dateकेवल कमांड के साथ करने का तरीका मिला :

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010

उसके लिए धन्यवाद। मैं उम्मीद कर रहा था कि कुछ सरल होगा, इसलिए अभी के लिए एक वोट अप करें।
उमंग

कैसे गूगल आपको बेवकूफ बनाता है इसके लिए एक और बढ़िया उदाहरण है। कोई भी कभी भी दस्तावेज नहीं पढ़ता है?

1
@ 2005 में कोरुटिल्स date -d @xxx5.3 तक समर्थन नहीं जोड़ा गया था। इससे पहले आपको यह करना था।
स्टीफन चेज़लस

@ StéphaneChazelas: ए) यह उत्तर 2010 और बी से है) इस बहाने दस्तावेजीकरण को पढ़ने से पहले गुगली क्यों करता है? यदि आप अपने स्वयं के प्राधिकरण से जवाब देते हैं, तो कोई इस तरह की त्रुटियां करने का बहाना कर सकता है, लेकिन यदि आपको इसे वैसे भी देखना है, तो इसे सही तरीके से देखें।

@, मैं सिर्फ इशारा कर रहा था कि यह एक मूर्खतापूर्ण जवाब नहीं था, सिर्फ एक पुराना।
स्टीफन चेज़लस

6

यह पर्ल वन-लाइनर करेगा:

$ perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010

5

शेल बिल्डरों के साथ:

  • zsh (4.1.1 (2003) और उससे अधिक):

    $ zmodload zsh/datetime
    $ TZ=UTC0 strftime %c 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    
  • ksh93( ksh93i(2000) और उससे अधिक):

    $ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
    
  • bash (४.२ (२०१०) और उससे अधिक):

    $ TZ=UTC0 printf '%(%c)T\n' 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    

उन सभी में, जो आप चाहते हैं %cउस strftime()प्रारूप से प्रतिस्थापित करें ।


क्या आपके पास bash printfसमाधान के लिए एक संदर्भ है ?
डेरेक महार

कोई बात नहीं, मैंने इसे gnu.org/software/bash/manual/bashref.html#Bash-Builtins के विवरण printfमें पाया
डेरेक महार

2

ओटीसी में, यूटीसी में होना चाहिए

date -r "1475737200" -u

धन्यवाद। मैंने संपादित किया है कि स्वीकृत उत्तर में जानकारी अधिक आसानी से उपलब्ध है।
स्टीफन चेज़लस

1

आधुनिक यूनिक्स की समृद्ध विरासत का एक और साफ उदाहरण। यह अधिकांश बीएसडी वेरिएंट के तहत वास्तव में संभव है:

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(BTW अपने उदाहरण एक दूसरे से दूर हो रहा है लगता है)


लिनक्स पर काम नहीं करता है। होप के जवाब से लगता है कि सही लिनक्स उत्तर है। यह इंगित करने के लिए धन्यवाद, मुझे संदेह था कि ऐसा कुछ होगा, मैंने इसे 45 सेकंड में बनाया है।
उमंग

1

एक पुराने प्रश्न का उत्तर दें, लेकिन मुझे लगता है कि यह एक सुधार हो सकता है यदि कोई और इसके लिए खोज करता है। यह बैश फ़ंक्शन लिनक्स और ओएस एक्स दोनों पर काम करता है। मैंने किसी अन्य बीएसडी सिस्टम पर परीक्षण नहीं किया है। इस फ़ंक्शन के तर्क के रूप में युगांतर पास करें और यह RFC-3339 समय प्रारूप को प्रिंट करेगा।

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
    if date --version >/dev/null 2>/dev/null; then
        # Linux
        date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${EPOCH} seconds"
        #date -d @${EPOCH} --rfc-3339=seconds
    else
        # OS X/BSD
        date -r ${EPOCH} ${RFC3339_FORMAT}
    fi
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.