Calcola la data di 1125 giorni fa su sistemi non GNU?

Sulla riga di comando Unix Bash, voglio calcolare la data di 1125 giorni fa utilizzando il sistema operativo di base (ad es. No Perl o Python).

Sui sistemi che eseguono GNU Date , posso fare qualcosa di simile:

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

I sistemi FreeBSD o MacOSX non vengono forniti con GNU Date e non supportano valori come “X giorni fa”.

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

Io posso calcolare una data di pochi giorni fa su un sistema Mac o FreeBSD, ma questo è limitato a pochi giorni:

# 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 

Posso calcolare vecchie date su sistemi non GNU senza approfondire strumenti come Perl o Python? O devo usare un linguaggio di scripting più potente?

Risposta

Bene, puoi fare qualcosa di subdolo come:

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

Testato su OpenBSD (data sicuramente non basata su GNU) e sembra funzionare.

Suddivisione in passaggi:

  • ottieni il tempo universale corrente (secondi dallinizio dellepoca unix):
 $ date +%s 1291679934 
  • ottieni il numero di secondi in 1125 giorni
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • sottrarre uno dallaltro (1291679934 – 97200000) = 1194478815

  • usa il nuovo unixtime (1194478815) per stampare una bella data

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • In alternativa, su solaris puoi farlo per stampare la data *:

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

* referenziato da http://www.sun.com/bigadmin/shellme/

Inoltre, unalternativa su Solaris per ottenere il timestamp corrente dal comando date ** è:

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

** referenziato da http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Commenti

  • Tieni presente che %s e date -r sono BSDismi (dai primissimi giorni, quindi ‘ re su tutte le piattaforme BSD). Non ‘ aspettarti di vederli sulle piattaforme System V (ad esempio Solaris non ha nessuno dei due).
  • Ah, Solaris, quanto ti amo … (;
  • @Gilles: Sei sicuro? Solaris ha una moltitudine di directory bin, come / usr / ucb / bin, che contengono versioni di altre varianti di unix. Dopo tutto SunOS 4.X era basato su BSD.
  • Questo non riesce quando uno qualsiasi dei giorni intermedi ha più o meno di 60 * 60 * 24 secondi, come i secondi intercalari e le modifiche al calendario.
  • @Sparr: buon punto. Una cassaforte è quello di sottrarre lora del giorno corrente dalla data assoluta corrente e di aggiungere 12 * 60 * 60. Ciò restituisce unora del giorno compresa tra 10:59 e 13:01. Aggiungendo periodi di 24 ore a questo e ottenendo il la data corrispondente è sicura.

Risposta

La risposta precedente era troppo complicata. FreeBSD / macOS hanno -v flag per date, dalla pagina MAN (descrizione abbreviata):

Modifica (ad esempio, prendi la data corrente e visualizza il risultato della correzione; non impostare effettivamente la data) i secondi, i minuti, lora, il giorno del mese, il giorno della settimana, il mese o lanno secondo val. Se val è preceduto da un segno più o meno, la data viene regolata in avanti o indietro in base alla stringa rimanente, altrimenti viene impostata la parte rilevante della data. La data può essere regolata tante volte quanto necessario utilizzando questi flag. I flag vengono elaborati nellordine fornito.

Quindi, per il tuo scopo, date -v1125d farà semplicemente ciò di cui hai bisogno

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

Risposta

Ho riscontrato un problema simile Ho trovato il dateutils pkg per OpenBSD 6.4. Per me era un semplice pkg_add dateutils.

#!/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 

Il mio output qui è

#2018.11 

AGGIORNAMENTO 1

Eseguo questo comando il 10 dicembre 2018

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

Risultato

 2015.11 

Supporta qualsiasi somma o sottrazione di tempo che posso dire. Ecco i comandi che aiutano a stampare. #dadd -h (questa non è lintera stampa. Sono disponibili ulteriori informazioni sulle opzioni.

 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 

Ecco i comandi.

Ecco le opzioni di formattazione.

Commenti

  • (1) ‘ è carino che questo programma supporti -1mo. Puoi dimostrare che consente allutente di calcolare la data di 1125 giorni fa, come chiede la domanda? (2) La domanda dice ” utilizzando la base sistema operativo (es. No Perl o Python). ” Ciò sembrerebbe precludere laggiunta di un nuovo pacchetto.
  • @ G-Man Grazie per il commento. Sono nuovo nel contribuire a StackExchange. Grazie per laiuto. Vedi AGGIORNAMENTO 1

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *