बैश में टाइमस्टैम्प को तिथियों में कैसे बदलें?


270

मुझे एक शेल कमांड या स्क्रिप्ट की आवश्यकता है जो एक यूनिक्स टाइमस्टैम्प को एक तिथि में परिवर्तित करता है। इनपुट पहले पैरामीटर से या स्टड से, निम्न उपयोग पैटर्न के लिए अनुमति दे सकता है:

ts2date 1267619929

तथा

echo 1267619929 | ts2date

दोनों आदेशों का उत्पादन "बुध मार्च 3 13:38:49 2010" होना चाहिए।

जवाबों:


531

सामान्य लिनक्स वितरण के बाद के संस्करणों पर आप उपयोग कर सकते हैं:

date -d @1267619929

5
वन-लाइनर:date -d @$(date -u +%s)
माइक एटलस

26
किसलिए है @? मैं उस GNU मैन पेज को बिल्कुल नहीं देखता।
मार्क ई। हासे

13
@mehaase - मैन पेज नोट करता है कि तारीख स्ट्रिंग मैनपेज में प्रलेखित होने के लिए बहुत जटिल है, इसलिए यह जानकारी में वर्णित है: जानकारी '(
कोरुटिल्स

10
brew install coreutils; gdate -d @1267619929
मार्क फॉक्स

2
info 'Date input formats' आप सीधे dateरॉबर्ट नोड के साथ प्रारूपण जानकारी नोड स्वरूपण के लिए हो जाता है , और फिर प्रारूप विनिर्देशक का एक मेनू।
माइक

165
date -r <number>

मैक ओएस एक्स पर मेरे लिए काम करता है।


5
हाँ, लेकिन यह एक सेकंड के भिन्न को नहीं संभालता है।
एमजॉल्ड

1
और यह भ्रामक है क्योंकि यह अधिकांश लिनक्स सिस्टम पर उस तरह से काम नहीं कर रहा है, क्योंकि: freddy @ hases ~% date --help | grep - -r -r, --reference = FILE के अंतिम संशोधन समय को प्रदर्शित करें
frank42

1
हालांकि इस जवाब पर टिप्पणी सही है, ये राफा की गलती नहीं है, और वे उसका जवाब कम नहीं करते हैं।
माइक

29

यह संस्करण चिबॉर्ग के उत्तर के समान है , लेकिन यह बाहरी ttyऔर की आवश्यकता को समाप्त करता है cat। यह उपयोग करता है date, लेकिन आसानी से उपयोग कर सकता है gawk। आप शेबबैंग को बदल सकते हैं और सिंगल लोगों के साथ डबल स्क्वायर ब्रैकेट्स को बदल सकते हैं और यह अंदर भी चलेगा sh

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        read -r p
    else
        echo "No timestamp given." >&2
        exit
    fi
else
    p=$1
fi
date -d "@$p" +%c

+1: बहुत पूर्ण उत्तर और मुझे लगता है कि तिथि gawk से अधिक तेज़ है।
ब्रूनो ब्रैंट

@ ब्रूनो, तुम्हें कैसे पता कि तारीख गौक से तेज है।
भूतडॉग ghost

3
@Bruno, @ ghostdog74: मेरे सिस्टम पर, gawk(बहुत मोटे तौर पर) dateएक समय पर forलूप की तुलना में 15% तेज है , जिसमें केवल gawk 'BEGIN { print strftime("%c", 1256571985); }'या date -d '@1256571985' +%cआउटपुट के साथ रीडायरेक्ट किया गया है /dev/null
अगली सूचना तक रोक दिया गया।

1
मेरे लिए gawk की तुलना में तारीख थोड़ी (5%) तेज है (mac osx 10.9.2, दिनांक 8.23, gawk 4.1.1), लेकिन aw (g) का वास्तविक लाभ कई टाइमस्टैम्प के कॉलम के पाइप को स्वीकार करना है (देखें) नीचे मेरा जवाब), जो 1000 टाइमस्टैम्प के लिए स्क्रिप्ट को 250x तेज बनाता है।
वेब

3
ध्यान दें कि मेरा उत्तर ओपी की आवश्यकताओं को पूरा करता है जैसा कि प्रश्न में कहा गया है, लेकिन अब स्वीकार किया गया उत्तर नहीं है।
अगली सूचना तक रोक दिया गया।

17

आप जीएनयू तिथि का उपयोग कर सकते हैं, उदाहरण के लिए,

$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"

या

$ date -ud @1267619929

10

आप इस सरल awk स्क्रिप्ट का उपयोग कर सकते हैं:

#!/bin/gawk -f   
{ print strftime("%c", $0); }

नमूना उपयोग:

$ echo '1098181096' | ./a.awk 
Tue 19 Oct 2004 03:18:16 AM PDT
$

यह पहला उपयोग फिट नहीं है - कभी-कभी मैं टीएस को गूंजना नहीं चाहता और इसके बजाय एक पैरामीटर का उपयोग करता हूं।
चिबॉर्ग

कुछ पुराने बिजीबॉक्स संस्करण पर, date -s @काम नहीं करता है, और फिर awkभी करता है! बिना स्टड के एक उदाहरण भी उपयोगी होगा।
विक्टर सर्जिएंको

8

बैश 4.2 के बाद से आप उपयोग कर सकते printf's %(datefmt)Tप्रारूप:

$ printf '%(%c)T\n' 1267619929
Wed 03 Mar 2010 01:38:49 PM CET

यह अच्छा है, क्योंकि यह एक शेल बिलिन है। Datefmt के लिए प्रारूप एक स्ट्रिंग है जिसे स्वीकार किया जाता है strftime(3)(देखें man 3 strftime)। यहाँ %cहै:

%c वर्तमान स्थान के लिए पसंदीदा दिनांक और समय प्रतिनिधित्व।


अब यदि आप एक स्क्रिप्ट चाहते हैं जो एक तर्क को स्वीकार करता है और, यदि कोई भी प्रदान नहीं किया जाता है, तो स्टडिन पढ़ता है, आप इस प्रकार आगे बढ़ सकते हैं:

#!/bin/bash

if (($#)); then
    printf '%(%c)T\n' "$@"
else
    while read -r line; do
        printf '%(%c)T\n' "$line"
    done
fi

6

लॉग फ़ाइलों को कनवर्ट करते समय या उनकी निगरानी करते समय मैं इसका उपयोग करता हूं:

tail -f <log file> | gawk \
'{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'

वास्तव में मैं जो ढूंढ रहा था, उसे छोटा किया जा सकता हैawk '{ printf strftime("%c: ", $1); $1 = ""; print $0; }'
क्रिसव्यू

5

OSX, या BSD में, एक समान -rध्वज है जो स्पष्ट रूप से एक यूनिक्स टाइमस्टैम्प लेता है। यहां एक उदाहरण है जो चार बार तारीख चलाता है: पहली बार एक बार, यह दिखाने के लिए कि यह क्या है; यूनिक्स टाइमस्टैम्प के साथ रूपांतरण के लिए एक %s, और अंत में, एक, जो एक स्ट्रिंग को वापस प्रदान करता है , के साथ -rपरिवर्तित %sकरता है।

$  date; date +%s; date -r `date +%s`
Tue Oct 24 16:27:42 CDT 2017
1508880462
Tue Oct 24 16:27:42 CDT 2017

कम से कम, मेरी मशीन पर काम करने लगता है।

$ uname -a
Darwin XXX-XXXXXXXX 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64

यदि आपके पास पहले से ही एक टाइमस्टैम्प मूल्य है और आपको बस समतुल्य तिथि ज्ञात करने की आवश्यकता है, तो OS X में आप इसे केवल कमांड लाइन पर टाइप कर सकते हैं: दिनांक -r 1509453417
नोएल

1
यह सच है। यदि आप मेरे उत्तर को देखते हैं, तो मैं वास्तव में यह प्रदर्शित कर रहा हूं।
डैनियल फैरेल

5

आप इस तरह टाइमस्टैम्प से स्वरूपित तिथि प्राप्त कर सकते हैं

date +'%Y-%m-%d %H:%M:%S' -d "@timestamp"

अन्य तरीके के आसपास: तारीख -ud "@ 1585667718" + '% Y-% m-% d% H:% M:% S'
एंडीआना

3

मैंने एक स्क्रिप्ट लिखी है जो खुद ऐसा करती है:

#!/bin/bash
LANG=C
if [ -z "$1" ]; then
    if [  "$(tty)" = "not a tty" ]; then
            p=`cat`;
    else
            echo "No timestamp given."
            exit
    fi
else
    p=$1
fi
echo $p | gawk '{ print strftime("%c", $0); }'

1
आपके प्रश्न टैग में "बैश" शामिल है, लेकिन आपका शबंग "श" कहता है।
अगली सूचना तक रोक दिया गया।

3

इस जवाब में मैं डेनिस विलियमसन के जवाब को कॉपी करता हूं और स्क्रिप्ट में कई टाइमस्टैम्प के एक कॉलम को पाइप करते समय एक विशाल गति को बढ़ाने की अनुमति देने के लिए इसे थोड़ा संशोधित करता हूं। उदाहरण के लिए, मेरी मशीन पर xargs -n1 के साथ मूल स्क्रिप्ट में 1000 टाइमस्टैम्प को पाइपिंग करने पर इस संशोधित संस्करण के साथ 0.027 के विपरीत 6.929 का समय लगा:

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        cat - | gawk '{ print strftime("%c", $1); }'
    else
        echo "No timestamp given." >&2
        exit
    fi
else
    date -d @$1 +%c
fi

2

कुछ उदाहरण:

$ तारीख
Tue Mar 22 16:47:06 सीएसटी 2016

$ दिनांक -d "मंगल मार्च 22 16:47:06 सीएसटी 2016" "+% s"
1458636426

$ तारीख +% s
1458636453

$ तारीख -d @ 1458636426
Tue Mar 22 16:47:06 सीएसटी 2016

$ तारीख - तारीख = '@ 1458636426'
Tue Mar 22 16:47:06 सीएसटी 2016



2

मैं इस क्रॉस-प्लेटफॉर्म वन-लाइनर का उपयोग करता हूं:

date -d @1267619929 2>/dev/null || date -r 1267619929

यह सामान्य लिनक्स वितरण के macOS और बाद के संस्करणों दोनों में काम करना चाहिए।


0

शुद्ध बैश नहीं होने के बावजूद, निम्न लिपि एक स्ट्रिंग में लंबाई 13 की टाइमस्टैम्प्स को आपके स्थानीय समय सारणी में समतुल्य तारीख में बदल देगी।

timestamp_to_date.sh

#!/usr/bin/env bash
IT=$(cat /dev/stdin)
re='(.*)([0-9]{13})(.*)'
while [[ $IT =~ $re ]]; do
  TIMESTAMP=${BASH_REMATCH[2]}
  AS_DATE=$(echo "$TIMESTAMP" | perl -pe 's/([\d]{10})([\d]{3})/localtime $1/eg;')
  IT="${IT/$TIMESTAMP/$AS_DATE}"    
done
echo "$IT"

इनपुट

{"timestamp":"1573121629939","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}

उत्पादन

$ cat input | timestamp_to_date.sh

{"timestamp":"Thu Nov  7 06:13:49 2019","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}

-8

PHP में

$unix_time = 1256571985;

echo date("Y-m-d H:i:s",$unix_time)

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