দ্রুততার সাথে তারিখের পার্থক্য গণনা করুন


84

আমি প্রায়শই কিছু দ্রুত তারিখ গণনা করতে চাই, যেমন:

  • এই দুটি তারিখের মধ্যে পার্থক্য কী?
  • এই অন্যান্য তারিখের n সপ্তাহ পরে কী ?

আমি সাধারণত একটি ক্যালেন্ডার খুলি এবং দিনগুলি গণনা করি তবে আমার মনে হয় এমন কোনও প্রোগ্রাম / স্ক্রিপ্ট থাকা উচিত যা আমি এই ধরণের গণনা করতে ব্যবহার করতে পারি। কোনও পরামর্শ?


3
যখন জিএনইউ তারিখ উপলব্ধ না হয় তার জন্য তারিখগুলি বিয়োগ করতে ইউনিক্সের সরঞ্জামটিও দেখুন ।
গিলস

উত্তর:


106

"একটি তারিখের পরে n সপ্তাহ" জিএনইউ তারিখ (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যদি আপনি তারিখ গণনা অন্যভাবে চান, বা এটি কিছুটা গুরুত্বপূর্ণ না করার জন্য কিছুটা ফ্যানসিয়ার পান। তদুপরি, ব্যবধানে ডিএসটি থেকে ডিএসটি স্থানান্তর না হওয়ার ক্ষেত্রে একদিন কেবল ২৩ ঘন্টা দীর্ঘ হবে; যোগফলকে ½ দিন যোগ করে আপনি ক্ষতিপূরণ দিতে পারবেন।

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
@ ডন_ক্রিসটি পার্সার কেবলমাত্র সংখ্যা এবং তারিখের মধ্যে পার্থক্য করতে পারে না, এটি বর্তমান মাস্টার (d0008f98) এ ঠিক করা হয়েছে
hroptatyr

আপনার কাছে ডেটুটিলগুলির উইন্ডোর বাইনারি বিতরণ রয়েছে?
মোশ

@ মোশ না, এবং আমার চেষ্টা করার সুযোগ নেই।
hroptatyr

এখানে পার্টিতে দেরীতে, তবে উইন্ডোতে আপনার প্রয়োজন পড়লে ডেটুটিলস সিগউইনে রয়েছে।
গ্রেগবি 212

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
এটি আমার জন্য পাইথন 3-সি "ডেট টাইম আমদানির তারিখ থেকে ডি হিসাবে প্রিন্ট করে (প্রিন্ট (ডিসেম্বর) (ডি - ২০১ 2016, 1, 9))" শেষে দিনগুলি প্রয়োজন হয় না
কিরণ কে তেলুকুন্টা

13

আমি সাধারণত ইউনিক্স ইউটাইম ফর্ম্যাটে সময় / তারিখ রাখার পছন্দ করি (সত্তর দশক শুরু হওয়ার পরে, সত্তর দশক শুরু হওয়ার পরে, ইউটিসি) seconds এইভাবে এটি সর্বদা প্লেইন বিয়োগ বা সেকেন্ডের যোগে সিদ্ধ হয়।

সমস্যাটি সাধারণত কোনও তারিখ / সময়কে এই ফর্ম্যাটে রূপান্তরিত করে।

শেল এনভায়রনমেন্ট / স্ক্রিপ্ট এ আপনি এটি পেতে পারেন date '+%s' লেখার সময়, বর্তমান সময় 1321358027

২০১১-১১-০৪ (আমার জন্মদিন) এর সাথে তুলনা করতে date '+%s' -d 2011-11-04, ফলন হচ্ছে 1320361200। বিয়োগ: সেকেন্ড expr 1321358027 - 1320361200দেয় 996827, যা expr 996827 / 86400= 11 দিন আগে।

ইউটিউম (1320361200 ফর্ম্যাট) থেকে একটি তারিখে রূপান্তর করা আদর্শ লাইব্রেরি ব্যবহার করে উদাহরণ সি, পিএইচপি বা পার্লের পক্ষে করা খুব সহজ। জিএনইউ দিয়ে date, "যুগের পর থেকে দ্বিতীয়" ফর্ম্যাটটি নির্দেশ -dকরতে আর্গুমেন্টটি চাপানো যেতে পারে @


7
জিএনইউ তারিখের সাথে, date -d @1234567890মহাকাশ থেকে কয়েক সেকেন্ড থেকে রূপান্তর করে আপনি যে নির্দিষ্ট তারিখের ফর্ম্যাটটি নির্দিষ্ট করেন to
গিলস

1
@ গিলস: এটি উজ্জ্বল। ম্যানপেজে এটি খুঁজে পাওয়া যায়নি। তুমি কোথায় শিখলে?
ম্যাটবিয়ানকো

1
@ ম্যাটবিয়ানকো, দেখুন info date, বিশেষত দ্বিতীয় সেকেন্ডগুলি এপোড নোডের পর থেকে : "আপনি যদি` @ 'দিয়ে কোনও সংখ্যার আগে চলে থাকেন তবে এটি একটি সেকেন্ডের গণনা হিসাবে একটি অভ্যন্তরীণ টাইম স্ট্যাম্পের প্রতিনিধিত্ব করে ”"
মানটওয়ার্ক

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 মাসের কভারটি গুরুত্বপূর্ণ। উদাহরণ স্বরূপ:

$ 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

বিয়োগের বিপরীত ক্রিয়াকলাপ হিসাবে বিয়োগের জন্য, ক্রমের ক্রমটি বিপরীত করতে হবে। যোগ করা বছর, THEN মাস, ত্রিশ দিন যোগ করে। বিয়োগ করে যদি বিয়োগটি ব্যবহার করা হয় তবে আপনি আবার আপনার শুরুতে ফিরে যাবেন। এটি হয় না, তাই আপনি করবেন না, যদি দিনগুলি অফসেটটি একটি ভিন্ন দৈর্ঘ্যের মাসে এক মাসের সীমানা অতিক্রম করে।

আপনার যদি শেষের তারিখ এবং বয়স থেকে পিছনের দিকে কাজ করার দরকার হয় তবে আপনি একাধিক অনুরোধের মাধ্যমে এটি করতে পারেন date। প্রথমে দিনগুলি, পরে মাসগুলি, তারপর বছরগুলিকে বিয়োগ করুন। ( dateফ্রি ফেব্রুয়ারির দৈর্ঘ্য পরিবর্তনের জন্য লিপ বছরগুলি থাকার কারণে আমি একক অনুরোধে বছর এবং মাস একত্রিত করা নিরাপদ বলে মনে করি না ।)


7

যদি কোনও গ্রাফিকাল সরঞ্জাম আপনার জন্য ঠিক থাকে তবে আমি আন্তরিকভাবে সুপারিশ করব qalculate(ইউনিট রূপান্তরগুলির উপর জোর দিয়ে একটি ক্যালকুলেটর, এটি একটি জিটিকে এবং কেডিএ ইন্টারফেস, আইআইআরসি সঙ্গে আসে)। সেখানে আপনি যেমন বলতে পারেন

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)'-> 140
সিয়েরসডেট্যান্ডিল

3

তারিখ গণনার জন্য আমি প্রায়শই এসকিউএল ব্যবহার করি। উদাহরণস্বরূপ মাইএসকিউএল , পোস্টগ্রেএসকিউএল বা এসকিউএলাইট :

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

এটি জিএনইউ সংস্করণে কাজ করে date, তবে পিসি-বিএসডি / ফ্রিবিএসডি সংস্করণে নয়। আমি coreutilsপোর্ট ট্রি থেকে ইনস্টল করেছি এবং /usr/local/bin/gdateপরিবর্তে কমান্ডটি ব্যবহার করেছি।


1
এই স্ক্রিপ্টটি চলবে না। শেষ লাইনে একটি টাইপো রয়েছে এবং ভেরিয়েবল অ্যাসাইনমেন্টের চারপাশে ফাঁকা স্থান রয়েছে, সুতরাং বাশ দুটি আর্গুমেন্টের সাহায্যে ডেটএফ্সার্স্ট নামক একটি প্রোগ্রাম চালানোর চেষ্টা করছে। এটি ব্যবহার করে দেখুন: DATEfirstnum=$(date -d "$1" +%s) DATElastnum=$(date -d "$2" +%s) এছাড়াও, এই স্ক্রিপ্টটি দুটি পৃথক বছরের মধ্যে পার্থক্য গণনা করতে সক্ষম হবে না। +%jবছরের দিনকে বোঝায় (001..366) তাই আউটপুটস ./date_difference.sh 12/31/2001 12/30/2014-১। অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে যে আপনাকে 1970-01-01 00:00:00 ইউটিসি থেকে উভয় তারিখকে সেকেন্ডে রূপান্তর করতে হবে।
ছয়

$গাণিতিক প্রকাশের ভিতরে আপনার প্রয়োজন নেই : $((DATElastnum - DATEfirstnum))এটিও কাজ করবে।
রুসলান

3

ডানাস সলিউশনগুলির সাহায্যে নিম্নলিখিত কোড সহ এক লাইনে এটি করা যেতে পারে:

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

(পাইথন 2.x এবং পাইথন 3 উভয় ক্ষেত্রেই কাজ করে))


1
আপনি মন্তব্য করার পরিবর্তে আপনার পোস্ট সম্পাদনা করতে পারেন
স্টিফেন রাউচ

3

dateএবং বাশ তারিখের পার্থক্য করতে পারে (ওএস এক্স অপশন দেখানো হয়েছে)। প্রথমটির পরে প্রথম দিন।

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

1

জিএনইউ তারিখের সাথে জিএনইউ ইউনিটের সময়ের গণনাও রয়েছে:

$ 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

(বন্দুকগুলি লিনাক্সে ইউনিট, তারিখের তারিখ)


1

datediff.sh on github: গিস্ট

#!/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 ইউটিসি থেকে তারিখের সময়টিকে সেকেন্ডে পরিবর্তন করে nan bcদুটি সংখ্যার মধ্যে পার্থক্য গণনা করে এবং বিভাজক ফ্যাক্টরটি আমাদেরকে বিভিন্ন ইউনিট দেয়। printfযদি প্রয়োজন হয় ( bcনা হয়) দশমিক স্থানের আগে 0 যুক্ত করে এবং নিশ্চিত করে যে রাউন্ডিংটি নিকটস্থ ( 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 দিনকে যুক্তিসঙ্গত আনুমানিক হিসাবে ব্যবহার করতে পারে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.