UNIX में उपकरण दिनांक घटाने के लिए


22

क्या तारीखों को घटाने के लिए सोलारिस यूनिक्स (ताकि कोई जीएनयू उपकरण उपलब्ध नहीं है) में कोई उपकरण है? मुझे पता है कि लिनक्स में हमारे पास gawkएक तारीख को दूसरे से घटा सकते हैं। लेकिन सोलारिस में हमारे पास अधिकतम nawk(सुधार awk) है जो तारीख की गणना नहीं कर सकता है। इसके अलावा मैं पर्ल का उपयोग नहीं कर सकता।

क्या तारीख की गणना करने का कोई तरीका है 20100909 - 20001010?

अद्यतन: bcतारीखों की गणना करने में सक्षम है?


1
जीएनयू तिथि उपलब्ध होने पर, तारीख के अंतर को भी शीघ्रता से देखें ।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


10

यहाँ एक awk script है जो मैंने अभी लिखी है, एक POSIX awk के साथ काम करना चाहिए। आपको सोलारिस संस्करण का प्रयास करना होगा; याद रखें कि सोलारिस पर Awk के दो संस्करण हैं, एक / बिन में और एक / usr / xpg4 / bin / awk में (जो nawk है, मुझे विश्वास है)।

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`

मैंने ओरेकल के साथ आपके तर्क की जाँच की। कुछ तिथियों के लिए यह ठीक है, हालांकि इसके लिए एक फ्लोट नंबर उत्पन्न होता है। मुझे डर है कि मुझे एक पूर्णांक संख्या में विभाजित करना है, क्या यह है?
15:17 पर jyz

दशमलव एक दूसरे का अंश है और इसकी आवश्यकता नहीं है।
Arcege करें

युग 20380119 की अवधि समाप्त हो रही है। वर्ष के जूलियन दिन का उपयोग क्यों नहीं किया जाता है? डुप
jas-

13

दुर्भाग्य से, POSIX कमांड लाइन उपयोगिताओं में से कोई भी तारीखों पर अंकगणित प्रदान नहीं करता है। date -dऔर date +%sअगर आपके पास उन्हें जाने का रास्ता है, लेकिन वे GNU एक्सटेंशन हैं।

उस समय की touchजाँच के लिए इस तरह के कामों के साथ एक अनाड़ी हैक होता है जो अतीत में कम से कम n दिन होता है:

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

(ध्यान दें कि यदि डीएसटी अंतराल में शुरू या बंद हो जाता है और स्क्रिप्ट 1 बजे से पहले चलती है तो यह कोड एक से बंद हो सकता है।)

कई लोगों ने बॉर्न या पोसिक्स शेल में डेट हेरफेर लाइब्रेरी को लागू करना समाप्त कर दिया है। Comp.unix.shell अकसर किये गए सवाल में कुछ उदाहरण और लिंक हैं ।

जीएनयू उपकरण स्थापित करना कम से कम दर्द का तरीका हो सकता है।


11

मैं dateकमांड का उपयोग करने की कोशिश करूँगा जो कि POSIX का हिस्सा है इसलिए यह हर जगह बस के बारे में है। अद्यतन: दुर्भाग्य से, ऐसा लगता है कि -d POSIX तारीख का हिस्सा नहीं है और संभवतः सोलारिस पर नहीं है। इस प्रकार यह संभावना ओपी प्रश्न का उत्तर नहीं देगी।

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

अब d1और d2पूर्णांक हैं जो यूनिक्स युग के बाद से सेकंड के अनुरूप हैं। इस प्रकार, दोनों के बीच अंतर पाने के लिए, हम $((d1-d2))जो कुछ भी इकाइयों को चाहते हैं, उसमें घटाते हैं। दिन सबसे आसान हैं:

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

यदि आपके पास बैश नहीं है तो रूपांतरण कैसे किया जाएगा यह अलग होगा। उपयोग करने का सबसे पोर्टेबल तरीका expr( expr का पॉज़िक्स मैन पेज ) हो सकता है।


हाँ, यह मेरे सवाल का जवाब नहीं देता क्योंकि यह सोलारिस है ... लेकिन आप
विचारधारा

8

रिकॉर्ड के लिए, डेट्यूटिल्स पोर्टेबल उपकरणों का एक सेट प्रदान करने का मेरा प्रयास है जो तिथि अंकगणित को कवर करता है। आपका उदाहरण उबलता है

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

-iइनपुट प्रारूप निर्दिष्ट करता है।


2
यह पैकेज बहुत बढ़िया है, और यह उबंटू ब्रह्मांड पुस्तकालयों में मौजूद है (कम से कम भरोसेमंद के लिए)। एक अन्य प्रणाली पर, मैं इसे खरोंच से आसानी से संकलित कर सकता हूं। अत्यधिक सिफारिशित। आपका बहुत बहुत धन्यवाद!
रॉबर्ट मुइल

आरएच पारिस्थितिक तंत्र के लिए फेडोरा और ईपीईएल में भी पैक किया गया है।
mattdm

4

पर्ल के स्थापित होने की संभावना है, और यह CPAN से मॉड्यूल को हथियाने , उन्हें अपने घर निर्देशिका में स्थापित करने और उन्हें अपने कार्यक्रम में संदर्भित करने के लिए काफी आसान है । इस स्थिति में, दिनांक :: Calc मॉड्यूल में एक Delta_Daysसबरूटीन है जो मदद करेगा।


3

सोलारिस पर जीएनयू की तारीख:

मैं फिर कहता हूं:

बहुत से Solaris SysAdmins सूर्य से (अब Oracle) के आधिकारिक पैकेजों को जानबूझकर स्थापित नहीं करने पर गर्व करते हैं जो एक नए होस्ट को कॉन्फ़िगर करते समय सोलारिस सिस्टम "GNU संगत" बनाते हैं। मुझे क्यों पीटता है।

GNU दिनांक उत्कृष्ट है और किसी भी Solaris होस्ट, IMHO पर डिफ़ॉल्ट रूप से उपलब्ध होनी चाहिए।

सोलारिस 10 पर

Solaris साथी सीडी से पैकेज SFWcoreu स्थापित करें। इंस्टॉल करने के बाद आपको GNU की तारीख मिल जाएगी/opt/sfw/bin/date

सोलारिस 11 पर

आपके पास पहले से ही यह हो सकता है क्योंकि मेरा मानना ​​है कि यह मानक स्थापित का हिस्सा है। हालांकि gdateइसे तिथि के सन संस्करण से अलग करने के लिए कहा जाता है।

स्थापित न होने पर ऐसा करें:

pkg स्थापित // सोलारिस / फाइल / ग्नू-कोरुटिल्स

पारितोषिक के लिए धन्यवाद। क्या आप मुझे इसका उपयोग करने का एक उदाहरण दे सकते हैं? तो मैं इसे स्थापित करने के लिए sysadmin से पूछ सकता हूं ...
jyz

सोलारिस 11 पर, इसे दोनों के रूप में स्थापित किया जाएगा /usr/bin/gdateऔर /usr/gnu/bin/dateइसलिए आप इसे या तो नाम या $ PATH सेटिंग द्वारा उपयोग करना चुन सकते हैं।
alanc

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"

आपने अपने प्रश्न "gawk" को टैग किया है लेकिन आप कहते हैं कि "कोई GNU उपकरण नहीं"। गौक में तिथि अंकगणित है।


मैंने नहीं किया। किसी ने मेरी पोस्ट को संपादित किया और "gawk" टैग किया ...
jyz


1

1. %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`

3. तो, जवाब 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

MacOS के लिए तारीख के साथ BSD:

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

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