बश में तारीख समय स्ट्रिंग परिवर्तित करें


94

दिनांक समय स्ट्रिंग निम्न प्रारूप में है: 06/12/2012 07:21:22। मैं इसे UNIX टाइमस्टैम्प या युग में कैसे बदल सकता हूं?

जवाबों:


95

आप जो खोज रहे हैं, वह है date --date='06/12/2012 07:21:22' +"%s"। ध्यान रखें कि यह आप GNU कोरुटिल्स का उपयोग कर रहे हैं, क्योंकि दोनों --dateऔर %sप्रारूप स्ट्रिंग GNU एक्सटेंशन हैं। POSIX उन दोनों में से किसी को भी निर्दिष्ट नहीं करता है, इसलिए POSIX अनुरूप सिस्टम पर भी इस तरह के रूपांतरण करने का कोई पोर्टेबल तरीका नहीं है।

के अन्य संस्करणों के लिए उपयुक्त मैनुअल पेज से परामर्श करें date

नोट: बैश --dateऔर -dविकल्प यूएस या ISO8601 प्रारूप में तारीख की अपेक्षा करता है, यानी mm/dd/yyyyया yyyy-mm-dd, यूके, ईयू या किसी अन्य प्रारूप में नहीं।


9
जब मैं मैक OSX 10.8.2
बेन क्लेटन

6
मेरे जैसे noobs के लिए +"%s"उत्पादन प्रारूप के लिए खड़ा है और %s1970 के बाद से है सेकंड में समय का स्वरूप
razz

2
नोट: यदि आप किसी अन्य समयक्षेत्र (जैसे UTC) में समय निर्दिष्ट करना चाहते हैं -HHMM या + HHMM अंत तक। तो date --date='06/12/2012 07:21:22 -0000' +"%s"यूटीसी की तारीख को यूनिक्स टाइम स्टैम्प में परिवर्तित कर देता है
ग्रेग ब्रे

जीएनयू तिथि के लिए, यदि आप यूटीसी नोट का उपयोग करना चाहते हैं, तो प्रारूप gnu.org/software/coreutils/manual/html_node/…yyyy-mm-dd hh:mm:ss पर एक नज़र है :gdate --date='2019-06-18 00:02:00 +0000' +%s
आशुतोष जिंदल

Mac पर काम नहीं करता है ... मुझे आश्चर्य है कि एक मैक और लिनक्स पर दोनों काम करने के लिए एक तरह से वहाँ है यदि
nonopolarity

49

लिनक्स के लिए इस कमांड को रन करें

date -d '06/12/2012 07:21:22' +"%s"

Mac OSX के लिए यह कमांड चलाएँ

date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"

1
OSX पर वर्तमान समय के साथ टाइमस्टैम्प किसी भी तरह बढ़ जाता है। मैं वर्तमान में उस के लिए एक स्पष्टीकरण नहीं है ...
पॉल

3
अद्यतन: ऐसा इसलिए था क्योंकि यह मेरे स्थानीय समय के लिए टाइमस्टैम्प को समायोजित करता है मुझे लगता है ... एक -uध्वज को जोड़ने से इसे ठीक करना चाहिए।
पॉलिम

@AbdulRehmanJanjua -uझंडा आना चाहिए से पहले-f या फिर खोल व्याख्या झंडा, यह प्रारूप स्ट्रिंग। तो, यह होना चाहिए:date -j -u -f "%a..."

4
एक macOS टर्मिनल में बिलकुल ठीक नहीं है।
zneak

7
date -jf "%Y-%m-%d %H:%M:%S" "2018-01-08 14:45:00" +%s
डेविएस्टार

10

इनमें से बहुत से उत्तर अत्यधिक जटिल हैं और यह भी गायब है कि चर का उपयोग कैसे करें। यह है कि आप इसे मानक लिनक्स सिस्टम पर अधिक कैसे करेंगे (जैसा कि पहले उल्लेख किया गया था कि मैक उपयोगकर्ताओं के लिए तारीख कमांड को समायोजित करना होगा):

नमूना स्क्रिप्ट:

#!/bin/bash
orig="Apr 28 07:50:01"
epoch=$(date -d "${orig}" +"%s")
epoch_to_date=$(date -d @$epoch +%Y%m%d_%H%M%S)    

echo "RESULTS:"
echo "original = $orig"
echo "epoch conv = $epoch"
echo "epoch to human readable time stamp = $epoch_to_date"

का परिणाम :

RESULTS:
original = Apr 28 07:50:01
epoch conv = 1524916201 
epoch to human readable time stamp = 20180428_075001

या एक समारोह के रूप में:

# -- Converts from human to epoch or epoch to human, specifically "Apr 28 07:50:01" human.
#    typeset now=$(date +"%s")
#    typeset now_human_date=$(convert_cron_time "human" "$now")

function convert_cron_time() {
    case "${1,,}" in
        epoch)
            # human to epoch (eg. "Apr 28 07:50:01" to 1524916201)
            echo $(date -d "${2}" +"%s")
            ;;
        human)
            # epoch to human (eg. 1524916201 to "Apr 28 07:50:01")
            echo $(date -d "@${2}" +"%b %d %H:%M:%S")
            ;;
    esac
}

3
get_curr_date () {
    # get unix time
    DATE=$(date +%s)
    echo "DATE_CURR : "$DATE
}

conv_utime_hread () {
    # convert unix time to human readable format
    DATE_HREAD=$(date -d @$DATE +%Y%m%d_%H%M%S)
    echo "DATE_HREAD          : "$DATE_HREAD
}

5
ढेर अतिप्रवाह में आपका स्वागत है। अपने कोड के अतिरिक्त स्पष्टीकरण जोड़ने पर विचार करें।
ओलिवियर डी म्यूलर

2

पृष्ठभूमि समर्पित प्रक्रिया केdate रूप में कुशल समाधान

आदेश में अनुवाद के इस तरह के एक बहुत तेज ...

पहचान

इस पोस्ट में, आप पाएंगे

  • इसके बाद एक क्विक डेमो ,
  • कुछ स्पष्टीकरण ,
  • एक समारोह में कई के लिए useable Un * x उपकरण ( bc, rot13, sed...)।

क्विक डेमो

fifo=$HOME/.fifoDate-$$
mkfifo $fifo
exec 5> >(exec stdbuf -o0 date -f - +%s >$fifo 2>&1)
echo now 1>&5
exec 6< $fifo
rm $fifo
read -t 1 -u 6 now
echo $now

यह वर्तमान UNIXTIME आउटपुट होना चाहिए । वहाँ से, आप तुलना कर सकते हैं

time for i in {1..5000};do echo >&5 "now" ; read -t 1 -u6 ans;done
real    0m0.298s
user    0m0.132s
sys     0m0.096s

तथा:

time for i in {1..5000};do ans=$(date +%s -d "now");done 
real    0m6.826s
user    0m0.256s
sys     0m1.364s

6 सेकंड से अधिक से आधे से भी कम समय तक !! (मेरे मेजबान पर)

आप देख सकते हैं echo $ans, "now"द्वारा प्रतिस्थापित किया जा सकता है"2019-25-12 20:10:00" और इतने पर ...

वैकल्पिक रूप से, आप कर सकते हैं, एक बार दिनांक सबप्रोसेस की आवश्यकता समाप्त हो गई:

exec 5>&- ; exec 6<&-

मूल पोस्ट (विस्तृत विवरण)

परिवर्तित करने के लिए 1 कांटा चलाने के बजाय , dateकेवल 1 बार चलाएं और सभी रूपांतरण एक ही प्रक्रिया से करें (यह बहुत जल्दी बन सकता है !::

date -f - +%s <<eof
Apr 17  2014
May 21  2012
Mar  8 00:07
Feb 11 00:09
eof
1397685600
1337551200
1520464020
1518304140

नमूना:

start1=$(LANG=C ps ho lstart 1)
start2=$(LANG=C ps ho lstart $$)
dirchg=$(LANG=C date -r .)
read -p "A date: " userdate
{ read start1 ; read start2 ; read dirchg ; read userdate ;} < <(
   date -f - +%s <<<"$start1"$'\n'"$start2"$'\n'"$dirchg"$'\n'"$userdate" )

तो अब एक नज़र:

declare -p start1 start2 dirchg userdate

(कुछ उत्तर दे सकते हैं जैसे:

declare -- start1="1518549549"
declare -- start2="1520183716"
declare -- dirchg="1520601919"
declare -- userdate="1397685600"

यह एक निष्पादन में किया गया था!

लंबे समय तक चलने वाले उपप्रकार का उपयोग करना

हमें बस एक फिफ्टी चाहिए :

mkfifo /tmp/myDateFifo
exec 7> >(exec stdbuf -o0 /bin/date -f - +%s >/tmp/myDateFifo)
exec 8</tmp/myDateFifo
rm /tmp/myDateFifo

(नोट: जैसा कि प्रक्रिया चल रही है और सभी डिस्क्रिप्टर खोले गए हैं, हम सुरक्षित रूप से फीफो की फाइल सिस्टम प्रविष्टि को हटा सकते हैं।)

तो अब:

LANG=C ps ho lstart 1 $$ >&7
read -u 8 start1
read -u 8 start2
LANG=C date -r . >&7
read -u 8 dirchg

read -p "Some date: " userdate
echo >&7 $userdate
read -u 8 userdate

हम एक छोटे से समारोह में भाग ले सकते हैं:

mydate() {
    local var=$1;
    shift;
    echo >&7 $@
    read -u 8 $var
}

mydate start1 $(LANG=C ps ho lstart 1)
echo $start1

या मेरे newConnector फ़ंक्शन का उपयोग करें

साथ कार्यों के लिए जोड़ने MySQL/MariaDB , PostgreSQLऔरSQLite ...

आप उन्हें GitHub , या मेरी साइट पर अलग-अलग संस्करण में पा सकते हैं : डाउनलोड या शो

wget https://raw.githubusercontent.com/F-Hauri/Connector-bash/master/shell_connector.bash

. shell_connector.bash 
newConnector /bin/date '-f - +%s' @0 0

myDate "2018-1-1 12:00" test
echo $test
1514804400

नोटा: पर GitHub , कार्यों और परीक्षण फ़ाइलों अलग होती है। पर मेरी साइट परीक्षण बस चलाए जा रहे हैं पर यह स्क्रिप्ट नहीं है sourced

# Exit here if script is sourced
[ "$0" = "$BASH_SOURCE" ] || { true;return 0;}

2

बस सुनिश्चित करें कि आप किस टाइमजोन का उपयोग करना चाहते हैं।

datetime="06/12/2012 07:21:22"

सबसे लोकप्रिय उपयोग मशीन टाइमज़ोन लेता है।

date -d "$datetime" +"%s" #depends on local timezone, my output = "1339456882"

लेकिन अगर आप जानबूझकर UTC डेटाटाइम पास करना चाहते हैं और आप उचित टाइमज़ोन चाहते हैं, तो आपको -uध्वज जोड़ना होगा । अन्यथा आप इसे अपने स्थानीय समयक्षेत्र से परिवर्तित करते हैं।

date -u -d "$datetime" +"%s" #general output = "1339485682"

क्या होगा यदि मेरी तिथि का प्रारूप "YYYYmmdd" है? पूर्व। 20200827
मयूर गीते

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