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
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
%s
edate -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).