Calculați data de acum 1125 de zile pe sistemele non-GNU?

Pe linia de comandă Unix Bash, vreau să calculez data de acum 1125 zile folosind sistemul de operare de bază (de exemplu, fără Perl sau Python).

Pe sistemele care rulează Data GNU , pot face așa ceva:

ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007 

Sistemele FreeBSD sau MacOSX nu sunt livrate cu GNU Date și nu acceptă valori precum „acum X zile”.

freebsd81 $ date --date="+1125 days ago" date: illegal option -- - 

I pot calcula o dată de acum câteva zile pe un sistem Mac sau FreeBSD, dar acest lucru este limitat la câteva zile:

# Today is really Dec 6, 2010. 4 days ago it was: macosx $ TZ=GMT+96 date +%Y%m%d 20101202 # But that doesn"t work if I want to see the date 8 days ago: macosx $ TZ=GMT+192 date +%Y%m%d 20101206 

Pot calculați date vechi pe sisteme care nu sunt GNU fără a intra în instrumente precum Perl sau Python? Sau trebuie să folosesc un limbaj de scriptare mai puternic?

Răspunde

Ei bine, poți face ceva ascuns ca:

 $ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 

Testat pe OpenBSD (cu siguranță nu este o dată bazată pe GNU) și pare să funcționeze.

Descompunerea în pași:

  • obține unixtime curent (secunde de la începutul epocii unix):
 $ date +%s 1291679934 
  • obține numărul de secunde în 1125 zile
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • scade una din cealaltă (1291679934 – 97200000) = 1194478815

  • utilizați noul unixtime (1194478815) pentru a imprima o dată frumoasă

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Ca alternativă, pe solaris puteți face acest lucru pentru a imprima data *:

    /bin/echo "0t1194478815>Y\n<Y=Y" |adb

* la care se face referire din http://www.sun.com/bigadmin/shellme/

De asemenea, o alternativă pe Solaris pentru obținerea marcajului de timp curent din comanda de dată ** este:

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"

** menționat de la http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Comentarii

  • Rețineți că %s și date -r sunt BSDisme (încă din primele zile, deci ele ‘ re pe toate platformele BSD). Nu ‘ nu vă așteptați să le vedeți pe platformele System V (de exemplu, Solaris nu are nici una).
  • Ah, Solaris, cum te iubesc … (;
  • @ Gilles: Sunteți sigur? Solaris are o multitudine de directoare bin, cum ar fi / usr / ucb / bin, care conțin versiuni din alte variante ale unix. SunOS 4.X a fost, la urma urmei, BSD.
  • Acest lucru nu reușește atunci când oricare dintre zilele care intervin au mai mult sau mai puțin de 60 * 60 * 24 de secunde, cum ar fi secundele bisective și modificările calendarului.
  • @ Sparr: Bun punct. O siguranță abordarea este de a scădea ora curentă a zilei din data absolută curentă și de a adăuga 12 * 60 * 60. Aceasta returnează o oră a zilei între 10:59 și 13:01. Adăugând perioade de 24 de ore la aceasta și obținând data corespunzătoare este sigură.

Răspuns

Răspunsul anterior a fost mult prea complicat. FreeBSD / macOS au -v pavilion pentru date, din pagina MAN (descriere abreviată):

Ajustare (adică, ia data curentă și afișează rezultatul ajustării; nu se setează de fapt data) al doilea, minut, oră, lună zi, săptămână zi, lună sau an conform val. Dacă val este precedat de un semn plus sau minus, data este ajustată înainte sau înapoi în funcție de șirul rămas, altfel este setată partea relevantă a datei. Data poate fi ajustată de câte ori este necesar folosind aceste semnalizatoare. Steagurile sunt procesate în ordinea dată.

Deci, în scopul dvs., date -v1125d va face pur și simplu ceea ce aveți nevoie

$ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT 

Răspuns

Aveam o problemă similară și am găsit dateutils pkg pentru OpenBSD 6.4. A fost un pkg_add dateutils simplu pentru mine.

#!/bin/ksh # Using dateutils dadd (get current date) -1month -f (format to strftime) # Set Year in YYYY formant y is YY format lastMonth=$(dadd date -1mo -f "%Y.%m") echo $lastMonth mkdir /home/$usr/History/$lastMonth 

Afișarea mea aici este

#2018.11 

UPDATE 1

Execut această comandă în 2018.12.10

HostNameHere# dadd date -1125d -f "%Y.%m" 

Rezultat

 2015.11 

Acceptă orice adunări sau scăderi de timp pe care le pot spune. Iată comenzile care ajută la imprimare. #dadd -h (aceasta nu este totalitatea tipăririi. Există mai multe informații despre opțiuni.

 Usage: dadd [OPTION]... [DATE/TIME] [DURATION] Add DURATION to DATE/TIME and print the result. If DATE/TIME is omitted but DURATION is given, read a list of DATE/TIMEs from stdin. If DURATION is omitted but DATE/TIME is given, read a list of DURATIONs from stdin. Durations are specified as nY, nMO, nW, or nD for years, months, weeks, or days respectively, or nH, nM, nS for hours, minutes, and seconds, where N is a (possibly negative) number. The unit symbols can be written lower-case as well (y, mo, w, d, h, m, s) and the unit symbol `d" can be omitted. Note that duration addition is not commutative! 2000-03-30 +1mo +1d -> 2000-05-01 2000-03-30 +1d +1mo -> 2000-04-30 

Aici sunt comenzile.

Aici sunt opțiunile de formatare.

Comentarii

  • (1) Este ‘ bine că acest program acceptă -1mo. Puteți demonstra că permite utilizatorului să calculeze data de acum 1125 de zile, așa cum se pune întrebarea? (2) Întrebarea spune ” folosind baza sistemul de operare (de exemplu, fără Perl sau Python). ” Acest lucru pare să împiedice adăugarea unui nou pachet.
  • @ G-Man Vă mulțumim pentru comentariu. Sunt nou în ceea ce privește contribuția la StackExchange. Vă mulțumesc pentru ajutor. Consultați ACTUALIZARE 1

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *