लिनक्स, बैश पर युग के बाद से सेकंड में वर्तमान समय प्राप्त करें


633

मुझे कुछ सरल की आवश्यकता है date, लेकिन वर्तमान तिथि, घंटे, मिनट और सेकंड के बजाय 1970 से सेकंड में।

dateलगता है कि विकल्प की पेशकश नहीं है। क्या कोई आसान तरीका है?


22
क्षमा करें, मुझे यह कहना होगा ... '' तिथि उस विकल्प की पेशकश नहीं करती है। क्या कोई आसान तरीका है? '' - फिर से मैनुअल पढ़ें ;-)
TheBonsai

7
तारीख के कुछ संस्करणों में यह है और कुछ नहीं है। तो यह हमेशा मौजूद नहीं है। मैंने 'टाइप-ए डेट' चलाया और एक अलग संस्करण का उपयोग किया और यह काम किया।
स्कॉट रौले

1
FWIW, उबंटू में केवल / बिन / तारीख है, जिसके लिए @ Steef का उत्तर काम करता है
जोनाथन हार्टले

1
@TheBonsai जो 'तारीख' टूल के POSIX मानक संस्करण का हिस्सा नहीं है। सिर्फ इसलिए कि आपके संस्करण में यह (शायद GNU) है, आपको हर किसी के कार्यान्वयन को नहीं करना चाहिए।
व्याट8740

जवाबों:


1159

यह काम करना चाहिए:

date +%s

45
तारीख manpge से बदला जाना चाहिए %s seconds since 1970-01-01 00:00:00 UTCकरने के लिए %s seconds since the epoch, 1970-01-01 00:00:00 UTCक्योंकि मैं वहाँ में यह याद किया।
डेविन

3
मेरे लिए काम नहीं करता है। आदमी दिनांक% s नहीं दिखाता है। मेरे पास बैश का एक बहुत पुराना संस्करण (सोलारिस के लिए 3.2.51 (1)) होना चाहिए?
livefree75

7
@ livefree75 dateमें नहीं बनाया गया है bash, इसलिए आपके सिस्टम के जहाजों के कार्यान्वयन के bashसाथ आपके संस्करण का कोई लेना-देना नहीं है date
एड्रियन फ्रुविर्थ

11
और अगर आप नौ दशमलव स्थानों के लिए एक दूसरे के अंश चाहते हैं, तो उपयोग करें:date +%s.%N
जोनाथन हार्टले

19
मिलीसेकंड उपयोग के लिएdate +%s%3N
जुआन कैम्पा

133

बस जोड़ना है।

किसी भी तारीख (जैसे अक्टूबर 21 1973) के लिए युग (1 जनवरी 1970) के बाद से सेकंड प्राप्त करें।

date -d "Oct 21 1973" +%s


वापस सेकंड की संख्या में परिवर्तित करें

date --date @120024000


आदेश dateबहुत बहुमुखी है। एक और मस्त चीज़ जो आप डेट के साथ कर सकते हैं (बेशर्मी से कॉपी की हुई date --help)। अमेरिका के पश्चिमी तट पर अगले शुक्रवार को सुबह 9 बजे के लिए स्थानीय समय दिखाएं

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

बेहतर अभी तक, आदमी पृष्ठ http://man7.org/linux/man-pages/man1/date.1.html पढ़ने के लिए कुछ समय लें


यह ओपी का सवाल नहीं है, लेकिन यह मेरा जवाब देता है, इसलिए मुझ से +1।
एंथनीडी 973

शायद यह संस्करण है dateया क्योंकि मैं उपयोग कर रहा हूँ zsh(macOS कैटालिना), लेकिन यह मेरे लिए काम नहीं करता है। रनिंग $ date -d "Oct 21 1973" +%sआउटपुटusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
जोशुआ पिंटर

43

अब तक, सभी उत्तर बाहरी प्रोग्राम का उपयोग करते हैं date

बश 4.2 के बाद से, printfएक नया संशोधक %(dateformat)Tहै, जब तर्क के साथ प्रयोग किया जाता -1है वर्तमान तिथि प्रारूप के अनुसार dateformat, प्रारूप द्वारा strftime(3)( man 3 strftimeप्रारूप के बारे में जानकारी के लिए) दिया जाता है।

तो, एक शुद्ध बैश समाधान के लिए:

printf '%(%s)T\n' -1

या यदि आपको परिणाम को एक चर में संग्रहीत करने की आवश्यकता है var:

printf -v var '%(%s)T' -1

कोई बाहरी कार्यक्रम और कोई सदस्यता नहीं!

बश 4.3 के बाद से, यह निर्दिष्ट करना संभव नहीं है -1:

printf -v var '%(%s)T'

(लेकिन यह हमेशा तर्क देने के लिए समझदार हो सकता है -1)।

यदि आप -2इसके बजाय तर्क के रूप में उपयोग करते हैं -1, तो बैश उस समय का उपयोग करेगा, जो वर्तमान दिनांक के बजाय शेल प्रारंभ किया गया था। इसका उपयोग बीते हुए समय की गणना करने के लिए किया जा सकता है

$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422

9
आप उस -2स्थिति में उपयोग करना चाहते हैं जब आपके पास एक लंबी दौड़ का काम हो (आप बैकअप को नियंत्रित करने के लिए एक स्क्रिप्ट के बारे में सोचें) और अंत में एक मेल भेजें "बैकअप $ $ में शुरू हुआ $ अब पूरा" - जिसे -2स्टोर करने से बचने के साथ पूरा किया जा सकता है शुरुआत में समर्पित चर।
सेबेस्टियन जे।

23

अधिकांश आवक कार्यान्वयनों के साथ:

awk 'BEGIN {srand(); print srand()}'

21
वाह जो अस्पष्ट है
ericslaw

8
वाह, यह एक ऊपर देखने के लिए जाना था। यह एक व्यावहारिक समाधान है, लेकिन जरूरी नहीं कि यह अच्छा / पोर्टेबल हो। ऐसा लगता है कि awk का कार्यान्वयनsrand() आमतौर पर वर्तमान तिथि / समय के साथ होता है। srand()बीज के रूप में पहले इस्तेमाल किए गए मूल्य को वापस करने के लिए दूसरी कॉल ।
रयान रैंफोर्ड

23

शुद्ध बैश समाधान

चूंकि bash5.0 ( 7 जनवरी 2019 को जारी किया गया है ) आप अंतर्निर्मित चर का उपयोग कर सकते हैं EPOCHSECONDS

$ echo $EPOCHSECONDS
1547624774

वहाँ भी है EPOCHREALTIMEजिसमें सेकंड के अंश शामिल हैं।

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEदशमलव बिंदु को हटाकर माइक्रो-सेकंड (μs) में परिवर्तित किया जा सकता है। यह रुचि का हो सकता है जब bashबिल्ट-इन अंकगणित का उपयोग किया जाए (( expression ))जो केवल पूर्णांकों को संभाल सकता है।

$ echo ${EPOCHREALTIME/./}
1547624774371215

मुद्रित समय मूल्यों के ऊपर से सभी उदाहरणों में बेहतर पठनीयता के लिए बराबर हैं। वास्तव में समय मान भिन्न होगा क्योंकि प्रत्येक कमांड को निष्पादित होने में बहुत कम समय लगता है।


मिलीसेकंड रिज़ॉल्यूशन (उसी प्रारूप में date +%s%3N) के लिए आप उपयोग कर सकते हैंecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212

19

यह एक विस्तार है जो @pellucide ने किया है, लेकिन Mac के लिए:

किसी भी तारीख के लिए युग (1 जनवरी 1970) से सेकंड की संख्या निर्धारित करने के लिए (जैसे 21 अक्टूबर 1973)

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800

कृपया ध्यान दें, कि पूर्णता के लिए, मैंने समय भाग को प्रारूप में जोड़ दिया है। इसका कारण यह है कि dateआपने जो भी तारीख दी है उसे ले लेंगे और वर्तमान समय को प्रदान किए गए मूल्य में जोड़ देंगे । उदाहरण के लिए, यदि आप '00: 00: 00 'भाग के बिना 4:19 बजे उपरोक्त कमांड निष्पादित करते हैं, तो यह समय को स्वचालित रूप से जोड़ देगा। ऐसे कि "अक्टूबर 21 1973" को "21 अक्टूबर 1973 16:19:00" के रूप में देखा जाएगा। वह नहीं हो सकता है जो आप चाहते हैं।

अपने टाइमस्टैम्प को वापस दिनांक में बदलने के लिए:

$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973

दिनांक कार्यान्वयन के लिए Apple का मैन पेज: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html


1
स्पष्ट होने के लिए, यह बीएसडी के dateआदेश के लिए है, जबकि किसी भी समाधान का सुझाव date -dजीएनयू के लिए है date। MacOS में BSD की तारीख FreeBSD से आती है , और NetBSD और OpenBSD के साथ कई विकल्प साझा करती है। और यह पूरी तरह से बैश से अलग है।
घटि

%Nविकल्प gnu तारीख में आंशिक सेकंड के लिए उल्लेख किया MacOS तारीख से लापता है। 10.14 पर, कोई भी प्रारूप मैन पेज में नहीं है; वे strftime(3)मैन पेज में हैं, जो आपके पास नहीं होगा यदि आपके पास एक्सकोड स्थापित नहीं है, और यदि आप करते हैं तो भी मैन कमांड के साथ नहीं देख सकते हैं।
दान प्रिट्स

1

इस बैश स्क्रिप्ट (मेरे ~/bin/epoch) का उपयोग करें :

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.