তারিখগুলি বিয়োগ করার জন্য ইউনিক্সের সরঞ্জাম


22

তারিখগুলি বিয়োগ করার জন্য কি সোলারিস ইউনিক্সের কোনও সরঞ্জাম (তাই কোনও জিএনইউ সরঞ্জাম উপলব্ধ নেই) রয়েছে? আমি জানি যে লিনাক্সে আমাদের কাছে gawkঅন্য তারিখটি বিয়োগ করতে পারে। তবে সোলারিসে আমাদের কাছে সর্বোচ্চটি nawk(উন্নত awk) যা তারিখ গণনা করতে পারে না। এছাড়াও আমি পার্ল ব্যবহার করতে পারি না।

তারিখ গণনা করার মতো কোনও উপায় আছে 20100909 - 20001010?

আপডেট: bcতারিখ গণনা করতে সক্ষম?


উত্তর:


10

এখানে একটি সন্ত্রাস স্ক্রিপ্ট আমি সবে লিখেছি, একটি পজিক অ্যাজকের সাথে কাজ করা উচিত। আপনাকে সোলারিস সংস্করণ চেষ্টা করতে হবে; মনে রাখবেন সোলারিসে অ্যাওকের দুটি সংস্করণও রয়েছে, একটিতে / বিন এবং একটিতে / ইউএসআর / এক্সপিজি 4 / বিন / অ্যাওক (যা নওক, আমি বিশ্বাস করি)।

BEGIN {
    daysofmonth["01"] = 0; daysofmonth["02"] = 31; daysofmonth["03"] = 59;
    daysofmonth["04"] = 90; daysofmonth["05"] = 120; daysofmonth["06"] = 151;
    daysofmonth["07"] = 181; daysofmonth["08"] = 212; daysofmonth["09"] = 243;
    daysofmonth["10"] = 273; daysofmonth["11"] = 304; daysofmonth["12"] = 334;
    fullday = 86400;
}
/[12][09][0-9][0-9][01][0-9][0123][0-9]/ {
    year = substr($0, 1, 4); month = substr($0, 5, 2); day = substr($0, 7, 2);
    date = ((year - 1970) * 365.25) + daysofmonth[month] + day - 1;
    if ((year % 4) == 0 && month > 2) { date = date + 1; }
    print date * fullday - (25200);
}
{}

একটি YYYYmmdd তারিখের স্ট্রিংটি পাশ করুন এবং এপোকের পর থেকে এটি সেকেন্ডের সংখ্যায় রূপান্তরিত হবে (দিনের সীমানায় থাকার জন্য কিছুটা দেওয়ার জন্য)। তারপরে আপনি দুটি বিয়োগ করতে সক্ষম হবেন।

today=`echo 20110210 | awk -f convdate.awk`
then=`echo 20001231 | awk -f convdate.awk`
sincethen=`expr $today - $then`

আমি ওরাকল দিয়ে আপনার যুক্তি পরীক্ষা করেছি। কিছু তারিখ ঠিক আছে, তবে এটির জন্য একটি ভাসমান সংখ্যা উত্পন্ন করে। আমি আশঙ্কা করছি আমাকে একটি পূর্ণসংখ্যার সংখ্যায় কাটাতে হবে, তাই না?
jyz

দশমিক হ'ল একটি সেকেন্ডের ভগ্নাংশ এবং প্রয়োজনীয়ভাবে প্রয়োজন হয় না।
আর্জেজ

যুগে যুগে যুগে যুগে যুগে জুলিয়ান দিনটি ব্যবহার করবেন না? ডুপে
দ্য

13

দুর্ভাগ্যক্রমে, পসিক্স কমান্ড লাইনের কোনওটিই তারিখগুলিতে পাটিগণিত সরবরাহ করে না। date -dএবং date +%sযদি আপনার কাছে থাকে তবে সেগুলি হ'ল উপায় তবে তারা জিএনইউ এক্সটেনশন।

touchসেই তারিখটি অতীতে কমপক্ষে n দিন হয়েছে কিনা তা পরীক্ষা করার জন্য এই ধরণের কাজের সাথে একটি আনাড়ি হ্যাক রয়েছে :

touch -t 201009090000 stamp
if [ -n "$(find stamp -mtime +42)" ]; then ...

(দ্রষ্টব্য যে ডিএসটি যদি বিরতিতে শুরু হয় বা বন্ধ হয়ে যায় এবং স্ক্রিপ্টটি সকাল 1 টার আগে চলে তবে এই কোডটি এক দ্বারা বন্ধ হয়ে যেতে পারে))

বেশ কিছু লোক বোর্নে বা পসিক্স শেলের ডেট ম্যানিপুলেশন লাইব্রেরি প্রয়োগ করে শেষ করেছে। কম্প.উনিক্স.শেল এফএকিউতে কয়েকটি উদাহরণ এবং লিঙ্ক রয়েছে ।

জিএনইউ সরঞ্জামগুলি ইনস্টল করা সর্বনিম্ন ব্যথার উপায় হতে পারে।


11

আমি dateকমান্ডটি পজিক্সের অংশ হিসাবে ব্যবহার করার চেষ্টা করব যাতে এটি সর্বত্রই হয়। আপডেট: দুর্ভাগ্যক্রমে, দেখে মনে হচ্ছে যে -ডি পসিক্স তারিখের অংশ নয় এবং সম্ভবত সোলারিসে নেই। সুতরাং এটি সম্ভবত ওপিএস প্রশ্নের উত্তর দেবে না।

d1=`date -d 20100909 +%s`
d2=`date -d 20001010 +%s`

এখন d1এবং d2পূর্ণসংখ্যা যা ইউনিক্সের সূচনাকালীন কয়েক সেকেন্ডের সাথে মিল রয়েছে। এইভাবে উভয়ের মধ্যে পার্থক্য পেতে, আমরা বিয়োগ করি ( $((d1-d2))ব্যাশে) এবং আমরা যে ইউনিট চাই তা গোপন করি। দিনগুলি সবচেয়ে সহজ:

echo "$(((d1-d2)/86400)) days"

আপনার কাছে বাশ না থাকলে রূপান্তর কীভাবে করবেন তা সম্ভবত ভিন্ন। সর্বাধিক বহনযোগ্য উপায় হ'ল ব্যবহার expr( এক্সপ্রেসের পোস্টিক্স ম্যান পৃষ্ঠা )।


হ্যাঁ এটি আমার প্রশ্নের উত্তর দেয় না কারণ এটি সোলারিস ... তবে আদর্শ এবং পোস্টিংয়ের জন্য আপনাকে ধন্যবাদ :)
জাইজ

8

রেকর্ডের জন্য, ডেটুটিলগুলি পোর্টেবল সরঞ্জামগুলির একটি সেট সরবরাহ করার জন্য আমার প্রচেষ্টা যা তারিখের পাটিগণিতকে কভার করে। আপনার উদাহরণ ফুটে উঠেছে

ddiff -i '%Y%m%d' 20001010 20100909
=>
  3621

-iইনপুট ফর্ম্যাট নির্দিষ্ট করে।


2
এই প্যাকেজটি দুর্দান্ত and এবং এটি উবুন্টু মহাবিশ্বের লাইব্রেরিগুলিতে (অন্তত ট্রাস্টির জন্য) উপস্থিত রয়েছে। অন্য সিস্টেমে, আমি এটি স্ক্র্যাচ থেকে সহজেই সংকলন করতে পারি। অত্যন্ত বাঞ্ছনীয়. আপনাকে অনেক ধন্যবাদ!
রবার্ট মুয়েল 16

আরএইচ বাস্তুতন্ত্রের জন্য ফেডোরা এবং ইপিল-এও প্যাকেজ করা হয়েছে।
mattdm

4

পার্ল ইনস্টল হওয়ার সম্ভাবনা রয়েছে এবং সিপিএএন থেকে মডিউলগুলি ধরে নেওয়া , আপনার নিজের ডিরেক্টরি ডিরেক্টরিতে ইনস্টল করা এবং আপনার প্রোগ্রামে সেগুলি উল্লেখ করা যথেষ্ট সহজ । এই ক্ষেত্রে, তারিখ :: ক্যালক মডিউলে একটি Delta_Daysসাবরুটাইন রয়েছে যা সাহায্য করবে।


3

সোলারিসে রাইটিং জিএনইউ তারিখ:

আমি আবার এটি বলি:

অনেকগুলি সোলারিস সিসডমিনরা ইচ্ছাকৃতভাবে সান (এখন ওরাকল) থেকে অফিশিয়াল প্যাকেজগুলি ইনস্টল না করার জন্য গর্ব বোধ করে যা একটি নতুন হোস্ট কনফিগার করার সময় একটি সোলারিস সিস্টেম "GNU সামঞ্জস্যপূর্ণ" করে তোলে। আমাকে মারছে কেন।

জিএনইউ তারিখটি দুর্দান্ত এবং কোনও সোলারিস হোস্ট, আইএমএইচও-তে ডিফল্টরূপে উপলভ্য হওয়া উচিত।

সোলারিস 10 এ

সোলারিস কমপেনিয়ান সিডি থেকে প্যাকেজ এসএফডব্ল্যাকোরু ইনস্টল করুন। ইনস্টল করার পরে আপনি জিএনইউ তারিখটি খুঁজে পাবেন/opt/sfw/bin/date

সোলারিস 11 এ

এটি ইতিমধ্যে এটি থাকতে পারে কারণ আমি বিশ্বাস করি এটি স্ট্যান্ডার্ড ইনস্টলের অংশ। তবে gdateএটি তারিখের সান সংস্করণ থেকে পৃথক করার জন্য বলা হয়।

ইনস্টল না থাকলে এটি করুন:

পিকেজি ইনস্টল // সোলারিস / ফাইল / জিএনও-কোর্টিলস

ভকভগক. আপনি কীভাবে এটি ব্যবহার করবেন তার একটি উদাহরণ দিতে পারেন? সুতরাং আমি
সিসাদমিনকে

সোলারিস ১১-এ, এটি উভয় হিসাবেই ইনস্টল করা হবে /usr/bin/gdateএবং /usr/gnu/bin/dateতাই আপনি নাম বা AT PATH সেটিং দ্বারা এটি ব্যবহার করতে পারেন।
16

2

যদি পাইথন থাকে:

from time import *
date1 = strptime("20100909","%Y%m%d")
date2 = strptime("20001010","%Y%m%d")
diff = mktime(date1) - mktime(date2)
print repr(d/86400) + " days"

আপনি আপনার প্রশ্নটিকে "গাওক" ট্যাগ করেছেন তবে আপনি "জিএনইউ সরঞ্জাম নেই" বলছেন। গাওকের তারিখ পাটিগণিত রয়েছে।


আমি না। কেউ আমার পোস্ট সম্পাদনা করেছে এবং "
গাওক


1

1. তারিখ 1 এবং তারিখ 2 সংজ্ঞায়িত করুন %j বছরের দিন (001..366) ফর্ম্যাটে তারিখ 1 2

user@linux:~$ date1=`date -d 20100909 +%j` 
user@linux:~$ date2=`date -d 20001010 +%j`

2. এর সাথে পার্থক্য গণনা করুন expr

user@linux:~$ datediff=`expr $date2 - $date1`

৩. সুতরাং, উত্তরটি 32 দিন

user@linux:~$ echo $datediff days
32 days
user@linux:~$ 

... বা ওয়ান-লাইনার সলিউশন

user@linux:~$ echo $(( $(date -d 20001010 +%j) - $(date -d 20100909 +%j) )) days
32 days
user@linux:~$ 

অথবা

user@linux:~$ expr $(date -d 20001010 +%j) - $(date -d 20100909 +%j)
32
user@linux:~$

অথবা

user@linux:~$ expr `date -d 20001010 +%j` - `date -d 20100909 +%j`
32
user@linux:~$ 

0

ম্যাকোসের জন্য বিএসডি তারিখ সহ:

echo "Quelle est la date de début ?"
read DATE_DE_DEBUT
echo "Quelle est la date de fin ?"
read DATE_DE_FIN
ANNEE=$(($(echo $DATE_DE_FIN | awk -F "/" '{print $3}')-$(echo $DATE_DE_DEBUT  | awk -F "/" '{print $3}')))

echo " "

if [[ $ANNEE > 0 ]]; then

for((annee=$ANNEE-1 ; $ANNEE ; annee++))

  do
  #echo $annee  
  for((mois=0 ; 13 - $mois ; mois++))
      do
  #   echo année:$annee mois:$mois
          for((jour=0 ; 32 - $jour ; jour++))
              do
 #             echo année:$annee mois:$mois jour:$jour
           TEST=$(date -Rjf"%d/%m/%Y" -v +"$annee"y -v +"$mois"m -v +"$jour"d $DATE_DE_DEBUT +"%d/%m/%Y")
           if [[ $TEST = $DATE_DE_FIN ]]; then
                  echo "Différence entre le $DATE_DE_DEBUT et le $DATE_DE_FIN";
                  echo "est de :";
                  echo "$annee année(s) $mois mois $jour jour(s)";
             exit 0;
            fi


          done 
  done
  done

 else 
 annee=0
 for((mois=0 ; 13 - $mois ; mois++))
      do
#      echo année:$annee mois:$mois
          for((jour=0 ; 32 - $jour ; jour++))
              do
              #echo année:$annee mois:$mois jour:$jour
              TEST=$(date -Rjf"%d/%m/%Y" -v +"$annee"y -v +"$mois"m -v +"$jour"d $DATE_DE_DEBUT +"%d/%m/%Y")
              if [[ $TEST = $DATE_DE_FIN ]]; then 
                      echo "Différence entre le $DATE_DE_DEBUT et le $DATE_DE_FIN";
                     echo "est de :";
                     echo "$annee année(s) $mois mois $jour jour(s)";
              exit 0;
              fi
              done
      done

fi

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