दिनांक अंतरों की तुरंत गणना करें


84

मैं अक्सर कुछ त्वरित गणना करना चाहता हूं, जैसे:

  • इन दोनों तिथियों में क्या अंतर है?
  • इस अन्य तारीख के बाद की तारीख n सप्ताह क्या है ?

मैं आमतौर पर एक कैलेंडर खोलता हूं और दिनों की गिनती करता हूं, लेकिन मुझे लगता है कि एक ऐसा कार्यक्रम / स्क्रिप्ट होनी चाहिए जिसका उपयोग मैं इस प्रकार की गणनाओं के लिए कर सकूं। कोई सुझाव?


3
जब GNU दिनांक उपलब्ध नहीं है , तो तारीखों को घटाने के लिए UNIX में टूल भी देखें ।
गाइल्स

जवाबों:


106

"तिथि के बाद के सप्ताह" GNU दिनांक (1) के साथ आसान है:

$ date -d 'now + 3 weeks'
Tue Dec  6 23:58:04 EST 2011
$ date -d 'Aug 4 + 3 weeks'
Thu Aug 25 00:00:00 EST 2011
$ date -d 'Jan 1 1982 + 11 weeks'
Fri Mar 19 00:00:00 EST 1982

मुझे दो तिथियों के बीच के अंतर की गणना करने का एक सरल तरीका नहीं पता है, लेकिन आप एक शेल फ़ंक्शन के साथ दिनांक (1) के आसपास थोड़ा तर्क लपेट सकते हैं।

datediff() {
    d1=$(date -d "$1" +%s)
    d2=$(date -d "$2" +%s)
    echo $(( (d1 - d2) / 86400 )) days
}
$ datediff '1 Nov' '1 Aug'
91 days

स्वैप करें d1और d2यदि आप चाहते हैं कि तारीख की गणना दूसरे तरीके से की जाए, या कोई बात नहीं बनाने के लिए थोड़ा प्रशंसक बनें। इसके अलावा, अगर अंतराल में डीएसटी संक्रमण के लिए गैर-डीएसटी है , तो एक दिन केवल 23 घंटे लंबा होगा; आप राशि में to दिन जोड़कर क्षतिपूर्ति कर सकते हैं।

echo $(( (((d1-d2) > 0 ? (d1-d2) : (d2-d1)) + 43200) / 86400 )) days

40

पोर्टेबल उपकरणों के एक सेट के लिए मेरे अपने डेट डेटिल्स आज़माएं । आपके दो उदाहरण एक-लाइनरों को उबालेंगे:

ddiff 2011-11-15 2012-04-11
=>
  148

या सप्ताह और दिनों में:

ddiff 2011-11-15 2012-04-11 -f '%w %d'
=>
  21 1

तथा

dadd 2011-11-15 21w
=>
  2012-04-10

3
+1 आपके टूल रॉक (हालांकि dateadd -i '%m%d%Y' 01012015 +1dयह काम नहीं करता है, यह सिर्फ अनिश्चित काल के लिए वहां लटका रहता है ... यह काम करता है यदि तिथि चश्मा एक
चार्ट

2
@don_crissti पार्सर केवल अंकों और अवधि के बीच अंतर नहीं कर सकता, यह वर्तमान मास्टर (d0008f98) में तय किया गया है
hroptatyr

क्या आपके पास खिड़की के बाइनरी डेट्रिब्यूट्स हैं?
मॉश

@ नहीं, और मेरे पास कोशिश करने के लिए सुविधाएं नहीं हैं।
होरप्टाटेयर

यहां पार्टी के लिए देर हो रही है, लेकिन अगर आपको विंडोज पर उपयोग करने की आवश्यकता है, तो डेटविनिल्स साइबरविन पर है।
gregb212

30

मैंने जितने दिन ग्रह चलाए हैं, उनकी गणना के लिए एक अजगर उदाहरण:

$ python
>>> from datetime import date as D
>>> print (D.today() - D(1980, 6, 14)).days
11476

2
बस अगर कोई चाहता है कि यह इंटरएक्टिव दुभाषिया में टाइप करने के बजाय केवल एक ही आदेश की तरह व्यवहार करे: ychaouche@ychaouche-PC ~ $ python -c "from datetime import date as d; print (d.today() - d(1980, 6, 14)).days" 12813 ychaouche@ychaouche-PC ~ $
ychaouche

1
यह मेरे लिए काम करता है python3 -c "डेटाइम इंपोर्ट डेट से d के रूप में; प्रिंट (d.today () - d (2016, 1, 9))" दिनों के अंत में आवश्यक नहीं है
किरण के तेलुकुंता

13

मैं आमतौर पर यूनिक्स यूटाइम प्रारूप में समय / तारीख (सेकंड के बाद की संख्या, जब सत्तर के दशक से शुरू होता है, यूटीसी) पसंद करता हूं। इस तरह यह हमेशा सादे घटाव या सेकंड के जोड़ को उबालता है।

समस्या आमतौर पर एक दिनांक / समय को इस प्रारूप में बदल देती है।

शेल वातावरण / स्क्रिप्ट में आप इसे date '+%s' लेखन के समय प्राप्त कर सकते हैं , वर्तमान समय है 1321358027

2011-11-04 (मेरा जन्मदिन) के साथ तुलना करने के लिए date '+%s' -d 2011-11-04, उपज 1320361200। घटाना: सेकंड expr 1321358027 - 1320361200देता है 996827, जो expr 996827 / 86400= 11 दिन पहले है।

एक ही समय में utime (1320361200 प्रारूप) से परिवर्तित करना उदाहरण C, PHP या पर्ल के लिए मानक पुस्तकालयों का उपयोग करने के लिए बहुत सरल है। जीएनयू के साथ date, -dतर्क को @"सेकंड के बाद के युग" प्रारूप को इंगित करने के लिए तैयार किया जा सकता है ।


7
जीएनयू तिथि के साथ, date -d @1234567890आप जो भी तारीख प्रारूप निर्दिष्ट करते हैं, वह युग से सेकंड में परिवर्तित होता है।
गाइल्स

1
@ गिल्स: यह शानदार है। वह मैनपेज पर नहीं मिला। आपने ऐसा कहां सीखा?
मैटबियानको

1
@MattBianco, देख info date, विशेष रूप से युग के बाद से सेकंड "यह सेकंड की गिनती के रूप में एक आंतरिक समय स्टाम्प का प्रतिनिधित्व करता है आप के साथ` एक संख्या पूर्व में होना तो @ ',। ": नोड
manatwork

8

date -d "$death_date - $y years - $m months - $d days"जन्म की तारीख (वंशावली के लिए) का उपयोग करते समय यह सामने आया । यह आदेश गलत है। महीने सभी समान लंबाई के नहीं हैं, इसलिए (date + offset) - offset != date। आयु, वर्ष / माह / दिन में, जन्म की तारीख से आगे बढ़ने के उपाय हैं।

$ date --utc -d 'mar 28 1867 +72years +11months +2days'
Fri Mar  1 00:00:00 UTC 1940

$ date --utc -d 'mar 1 1940 -72years -11months -2days'
Sat Mar 30 00:00:00 UTC 1867
# (2 days later than our starting point)

दिनांक दोनों मामलों में सही आउटपुट देता है, लेकिन दूसरे मामले में आप गलत प्रश्न पूछ रहे थे। यह वर्ष के 11 महीनों के लिए +/- 11 कवर, दिन जोड़ने / घटाने से पहले मायने रखता है। उदाहरण के लिए:

$ date --utc -d 'mar 31 1939  -1month'
Fri Mar  3 00:00:00 UTC 1939
$ date --utc -d 'mar 31 1940  -1month' # leap year
Sat Mar  2 00:00:00 UTC 1940
$ date --utc -d 'jan 31 1940  +1month' # leap year
Sat Mar  2 00:00:00 UTC 1940

जोड़ने के उलटा ऑपरेशन होने के लिए घटने के लिए, संचालन के क्रम को उलट देना होगा। वर्ष जोड़ना, कुछ महीने, कुछ दिन। यदि घटाना विपरीत क्रम का उपयोग करता है, तो आप अपने शुरुआती बिंदु पर वापस आ जाएंगे। यह नहीं है, तो आप नहीं करते हैं, अगर दिन ऑफसेट एक महीने की सीमा को एक अलग लंबाई महीने में पार करता है।

यदि आपको अंतिम तिथि और आयु से पीछे की ओर काम करने की आवश्यकता है, तो आप इसे कई चालान के साथ कर सकते हैं date। पहले दिन घटाओ, फिर महीने, फिर साल। (मुझे नहीं लगता कि एक ही dateमंगलाचरण में वर्षों और महीनों को जोड़ना सुरक्षित है , क्योंकि लीप वर्षों में फरवरी की लंबाई में बदलाव होता है।)


7

यदि एक ग्राफिकल टूल आपके लिए ठीक है, तो मैं दिल से सलाह देता हूं qalculate(यूनिट रूपांतरणों पर जोर देने वाला कैलकुलेटर, यह GTK और KDE इंटरफ़ेस, IIRC के साथ आता है)। वहां आप कह सकते हैं उदा

days(1900-05-21, 1900-01-01)

तारीखों के बीच दिनों की संख्या (140, चूंकि 1900 एक लीप वर्ष नहीं था) प्राप्त करने के लिए, लेकिन निश्चित रूप से आप भी कई बार ऐसा कर सकते हैं:

17:12:45 − 08:45:12

8.4591667यदि आप समय स्वरूपण के लिए आउटपुट सेट करते हैं, तो घंटे या, उपज देता है 8:27:33


3
यही कारण है कि बहुत अच्छा है, और इससे भी अधिक, क्योंकि qalculate करता है एक CLI है। कोशिश करो qalc, तो help days
स्पैरहॉक

qcalcउदाहरण: qalc -t 'days(1900-05-21, 1900-01-01)'-> १४०
१et

3

मैं अक्सर तारीख गणना के लिए SQL का उपयोग करता हूं। उदाहरण के लिए MySQL , PostgreSQL या SQLite :

bash-4.2$ mysql <<< "select datediff(current_date,'1980-06-14')"
datediff(current_date,'1980-06-14')
11477

bash-4.2$ psql <<< "select current_date-'1980-06-14'"
 ?column? 
----------
    11477
(1 row)

bash-4.2$ sqlite2 <<< "select julianday('now')-julianday('1980-06-14');"
11477.3524537035

दूसरी बार मैं सिर्फ जावास्क्रिप्ट के लिए मूड में महसूस करता हूं। उदाहरण के लिए स्पाइडरमोंकी , वेबकिट , सीड या नोड.जेएस :

bash-4.2$ js -e 'print((new Date()-new Date(1980,5,14))/1000/60/60/24)'
11477.477526192131

bash-4.2$ jsc-1 -e 'print((new Date()-new Date(1980,5,14))/1000/60/60/24)'
11477.47757960648

bash-4.2$ seed -e '(new Date()-new Date(1980,5,14))/1000/60/60/24'
11477.4776318287

bash-4.2$ node -pe '(new Date()-new Date(1980,5,14))/1000/60/60/24'
11624.520061481482

(जावास्क्रिप्ट Dateऑब्जेक्ट के कंस्ट्रक्टर के महीने को पास करते समय देखें । 0. के साथ शुरू होता है)


3

एक ही कैलेंडर वर्ष की दो तिथियों के बीच अंतर की गणना करने का दूसरा तरीका जिसका आप उपयोग कर सकते हैं:

date_difference.sh
1  #!/bin/bash
2  DATEfirstnum=`date -d "2014/5/14" +"%j"`
3  DATElastnum=`date -d "12/31/14" +"%j"`
4  DAYSdif=$(($DATElastnum - $DATEfirstnum))
5  echo "$DAYSdif"
  • पंक्ति 1 शेल की घोषणा करता है जो दुभाषिया का उपयोग करता है।
  • लाइन 2 dateवैरिएबल DATEfirstnum के बाहर से मान प्रदान करता है । -dझंडा इस मामले मई 14 वीं 2014 में एक समय प्रारूप में स्ट्रिंग प्रदर्शित करता है और +"%j"बताता है कि dateसिर्फ वर्ष (1-365) के दिन के लिए उत्पादन फ़ॉर्मेट करने के लिए।
  • लाइन 3 लाइन 2 के समान है, लेकिन स्ट्रिंग के लिए एक अलग तारीख और अलग प्रारूप के साथ, 31 दिसंबर 2014।
  • पंक्ति 4 DAYSdifदो दिनों के अंतर को मान प्रदान करती है ।
  • पंक्ति 5 का मान प्रदर्शित करता है DAYSdif

यह GNU संस्करण के साथ काम करता है date, लेकिन PC-BSD / FreeBSD संस्करण पर नहीं। मैंने coreutilsबंदरगाहों के पेड़ से स्थापित किया और /usr/local/bin/gdateइसके बजाय कमांड का उपयोग किया।


1
यह स्क्रिप्ट नहीं चलेगी। चर काम के आसपास अंतिम पंक्ति और रिक्त स्थान पर एक टाइपो है, इसलिए बैश दो तर्कों के साथ DATEfirst नाम से एक कार्यक्रम चलाने का प्रयास कर रहा है। यह कोशिश करें: DATEfirstnum=$(date -d "$1" +%s) DATElastnum=$(date -d "$2" +%s) इसके अलावा, यह स्क्रिप्ट दो अलग-अलग वर्षों के बीच के अंतर की गणना करने में सक्षम नहीं होगी। +%jवर्ष के दिन को संदर्भित करता है (001..366) इसलिए ./date_difference.sh 12/31/2001 12/30/2014आउटपुट -1। जैसा कि अन्य उत्तरों ने उल्लेख किया है कि आपको 1970-01-01 00:00:00 UTC के बाद से दोनों तिथियों को सेकंड में बदलने की आवश्यकता है।
छह

आपको $अंकगणितीय अभिव्यक्ति के अंदर की आवश्यकता नहीं है : $((DATElastnum - DATEfirstnum))यह भी काम करेगा।
रुस्लान

3

Dannas समाधानों की सहायता से यह निम्नलिखित कोड के साथ एक पंक्ति में किया जा सकता है:

python -c "from datetime import date as d; print(d.today() - d(2016, 7, 26))"

(दोनों पायथन 2.x और पायथन 3 में काम करता है)


1
आप टिप्पणी करने के बजाय अपने पोस्ट को संपादित कर सकते हैं
स्टीफन राउच

3

dateऔर बैश दिनांक अंतर (OS X विकल्प दिखाए गए) कर सकते हैं। बाद की तारीख पहले रखें।

echo $((($(date -jf%D "04/03/16" +%s) - $(date -jf%D "03/02/16" +%s)) / 86400))
# 31

1

GNU यूनिट की समय गणना भी GNU दिनांक के साथ संयुक्त है:

$ gunits $(gdate +%s)sec-$(gdate +%s -d -1234day)sec 'yr;mo;d;hr;min;s'
        3 yr + 4 mo + 16 d + 12 hr + 37 min + 26.751072 s
$ gunits $(gdate +%s -d '2015-1-2 3:45:00')sec-$(gdate +%s -d '2013-5-6 7:43:21')sec 'yr;mo;d;hr;min;s'
        1 yr + 7 mo + 27 d + 13 hr + 49 min + 26.206759 s

(गनीमत है लिनक्स में इकाइयाँ, gdate तारीख है)


1

dithiff.sh on github: gist

#!/bin/bash
#Simplest calculator two dates difference. By default in days

# Usage:
# ./datediff.sh first_date second_date [-(s|m|h|d) | --(seconds|minutes|hours|days)]

first_date=$(date -d "$1" "+%s")
second_date=$(date -d "$2" "+%s")

case "$3" in
"--seconds" | "-s") period=1;;
"--minutes" | "-m") period=60;;
"--hours" | "-h") period=$((60*60));;
"--days" | "-d" | "") period=$((60*60*24));;
esac

datediff=$(( ($first_date - $second_date)/($period) ))
echo $datediff

1

कैमह का जवाब इसका सबसे अधिक ध्यान रखता है, लेकिन हम गोलाई, समय क्षेत्र, आदि से निपटने के लिए सुधार कर सकते हैं, साथ ही हमें कुछ अतिरिक्त परिशुद्धता और हमारी इकाइयों को लेने की क्षमता मिलती है:

datediff() {
#convert dates to decimal seconds since 1970-01-01 00:00:00 UTC
date1seconds=$(date +%s.%N -d "$date1")
date2seconds=$(date +%s.%N -d "$date2")

#Calculate time difference in various time units
timeseconds=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)"))
timeminutes=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)/60"))
  timehours=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)/3600"))
   timedays=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)/86400"))
  timeweeks=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)/604800"))
}

-dबताता है dateकि हम कनवर्ट करने के लिए एक दिनांक-समय की आपूर्ति कर रहे हैं। +%s.%N1970-01-01 00:00:00 UTC के बाद से दिनांक-समय बदलकर सेकंड.नैनकॉन्ड्स हो गया। bcदो नंबरों के बीच अंतर की गणना करता है, और विभाजन कारक हमें अलग-अलग इकाइयाँ देता है। printfजरूरत पड़ने पर दशमलव स्थान से पहले एक 0 जोड़ता है ( bcनहीं करता है) और सुनिश्चित करता है कि गोलाई निकटतम ( bcबस ट्रंकट्स) तक जाती है। आप भी इस्तेमाल कर सकते हैं awk

अब इसे फंकी टेस्ट केस के साथ चलाते हैं,

date1='Tue Jul  9 10:18:04.031 PST 2020'
date2='Wed May  8 15:19:34.447 CDT 2019'
datediff "$date1" "$date2"

echo $timeseconds seconds
-36971909.584000000 seconds

echo $timeminutes minutes
-616198.493066667 minutes

echo $timehours hours
-10269.974884444 hours

echo $timedays days
-427.915620185 days

echo $timeweeks weeks
-61.130802884 weeks

ध्यान दें कि एक महीने या वर्ष की लंबाई हमेशा समान नहीं होती है, इसलिए वहां एक भी "सही" उत्तर नहीं है, हालांकि आजकल एक उचित अनुमान के रूप में 365.24 दिनों का उपयोग किया जा सकता है।


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