UNIX'te tarih çıkarmak için aracı


22

Solaris UNIX'te tarih çıkarmak için herhangi bir araç var (bu nedenle GNU aracı yok)? Linux'ta bunun gawkbir tarihi diğerinden çıkarabileceğimizi biliyorum . Ancak Solaris'te sahip olduğumuz maksimum değer nawk(gelişmiş awk) tarih hesaplamaları yapamamaktadır. Ayrıca perl kullanamıyorum.

Tarih hesaplamalarını yapmanın bir yolu var mı 20100909 - 20001010?

GÜNCELLEME: bcTarih hesaplamaları yapabiliyor mu?


1
Ayrıca bkz . GNU tarihinin müsait olduğu tarihler için tarih farklarını hızlıca hesaplayın .
Gilles 'SO- kötülük' stop 'kas

Yanıtlar:


10

İşte henüz yazdığım bir awk betiği, bir POSIX awk ile çalışması gerekir. Solaris sürümünü denemek zorunda kalacaksınız; Solaris'te iki tane Awk sürümü olduğunu unutmayın, biri / bin ve biri / usr / xpg4 / bin / awk.

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);
}
{}

Bir YYYYmmdd tarih dizgisini geçirin ve Epoch'tan bu yana saniye sayısına dönüştürülecektir (bir miktar günlük sınırlarda olduğu için). O zaman ikisini de çıkarabileceksiniz.

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

Mantığınızı Oracle ile kontrol ettim. Bazı tarihler için tamam, ancak bunun için bir şamandıra numarası oluşturur. Korkarım bir tam sayıya kısaltmak zorundayım değil mi?
jyz

Ondalık, bir saniyenin kesridir ve zorunlu olarak gerekli değildir.
Arcege

Çağ 20380119'da sona eriyor. Niçin Jülyenin gününü kullanmıyorsunuz? Dupe ... unix.stackexchange.com/questions/302266/…
jas

13

Ne yazık ki, POSIX komut satırı yardımcı programlarından hiçbiri tarihlerde aritmetik sağlamaz. date -dve date +%seğer onlara sahipseniz gitmenin yolu, ama onlar GNU eklentileridir.

touchBir tarihin en az n gün geçmiş olduğunu kontrol etmek için bu tür çalışmalarla ilgili sakarca bir kesmek var :

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

(DST aralıkta başlatılır veya durdurulursa ve komut dosyası 01: 00'den önce çalışırsa bu kodun birer birer kapalı olabileceğini unutmayın.)

Birçok kişi Bourne veya POSIX kabuğundaki tarih manipülasyon kütüphanelerini uygulamaya koydu. Comp.unix.shell SSS bölümünde birkaç örnek ve bağlantı vardır .

GNU aletlerini takmak en az acı verici olabilir.


11

datePOSIX'in bir parçası olan komutu kullanmayı denerdim , bu yüzden hemen hemen her yerdedir. GÜNCELLEME: Ne yazık ki, -d POSIX tarihinin bir parçası değil ve muhtemelen Solaris'te görünmüyor. Bu nedenle bu olasılık OP'lerin sorusuna cevap vermeyecektir.

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

Şimdi d1ve d2unix döneminden bu yana saniyelere karşılık gelen tamsayılar. Böylece, ikisi arasındaki farkı elde etmek için, ( $((d1-d2))bash cinsinden) çıkarır ve istediğimiz herhangi bir birime örtüşürüz. Günler en kolay olanıdır:

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

Eğer bash yoksa, dönüşümün nasıl yapılacağı muhtemelen farklı olacaktır. En portatif yol kullanmak olabilir expr( expr's posix man sayfası ).


evet bu o Solaris çünkü soruma cevap ... ama :) ideia ve gönderme için teşekkür ederiz gelmez
jyz

8

Kayıt için, dateutils , tarih aritmetik özelliğini kapsayan bir dizi taşınabilir araç sağlama girişimidir. Örneğiniz aşağı kayıyor

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

-iGiriş biçimini belirtir.


2
Bu paket harika ve Ubuntu evren kütüphanelerinde var (en azından Güvenilirlik için). Başka bir sistemde sıfırdan kolayca derleyebilirim. Şiddetle tavsiye edilir. Çok teşekkür ederim!
Robert Muil

Ayrıca RH ekosistemi için Fedora ve EPEL'de paketlenmiştir.
mattdm


3

Solaris'teki GNU’nun tarihi:

Bunu tekrar söylüyorum:

Çok sayıda Solaris SysAdmins, yeni bir ana bilgisayarı yapılandırırken Solaris sistemini "GNU uyumlu" yapan Sun'ın (şimdi Oracle) resmi paketlerini kasıtlı olarak kurmaktan gurur duyuyor. Beni yeniyor nedenini.

GNU Date mükemmeldir ve herhangi bir Solaris sunucusundaki IMHO'da varsayılan olarak bulunmalıdır.

Solaris 10'da

Solaris Companion CD'sinden SFWcoreu paketini kurun. Yüklemeden sonra GNU’yu/opt/sfw/bin/date

Solaris 11 hakkında

Standart kurulumun bir parçası olduğuna inandığım için zaten sahip olabilirsiniz. Ancak gdate, tarihin Sun versiyonundan ayırt etmek için çağrılır .

Takılı değilse bunu yapın:

pkg install // solaris / file / gnu-coreutils

Bahşiş için teşekkürler. Bana nasıl kullanılacağına dair bir örnek verebilir misiniz? Böylece sysadmin'den kurmasını isteyebilirim ...
jyz

Solaris 11'de, her ikisi olarak da yüklenir /usr/bin/gdateve /usr/gnu/bin/dateböylece adı veya $ PATH ayarıyla kullanmayı seçebilirsiniz.
alanc

2

Python'unuz varsa:

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"

Sorunuzu "gawk" olarak etiketlediniz ancak "GNU aracı yok" diyorsunuz. Gawk'in tarih aritmetiği vardır.


Yapmadım Birisi ... Gönderimimi düzenlenebilir ve "gawk" etiketli
jyz

2

piton:

 from datetime import datetime as dt
 a = dt(2010, 9, 9)
 b = dt(2000, 10, 10)
 print (a - b).days

1

1. 1. %jgünü ve 2. tarihi yılın günü (001..366) biçiminde tanımlayın

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

2. ile farkı hesaplayın expr

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

3. Yani, cevap 32 gündür

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

... veya Tek Astarlı Çözüm

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

veya

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

veya

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

0

MacOS için BSD tarihi ile:

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

0

Saniye cinsinden farkı döndürmek için awk Velor kütüphanesini kullanabilirsiniz:

$ velour -n 'print t_utc(2010, 9, 9) - t_utc(2000, 10, 10)'
312854400

Veya günler:

$ velour -n 'print t_secday(t_utc(2010, 9, 9) - t_utc(2000, 10, 10))'
3621
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.