På Unix Bash-kommandolinjen vil jeg beregne datoen fra 1125 dage siden ved hjælp af basisoperativsystemet (f.eks. No Perl eller Python).
På systemer, der kører GNU Date , kan jeg gøre noget som dette:
ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007
FreeBSD- eller MacOSX-systemer leveres ikke med GNU Date, og understøtter ikke værdier som “X dage siden”.
freebsd81 $ date --date="+1125 days ago" date: illegal option -- -
I kan beregne en dato fra et par dage siden på et Mac- eller FreeBSD-system, men dette er begrænset til et par dage:
# 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
Kan jeg beregne gamle datoer på ikke-GNU-systemer uden at gå ned i værktøjer som Perl eller Python? Eller skal jeg bruge et mere kraftfuldt skriptsprog?
Svar
Nå, du kan gøre noget luskende som:
$ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500
Testet på OpenBSD (bestemt ikke gnu-baseret dato) og ser ud til at fungere.
Fordeling af det i trin:
- få den aktuelle unixtime (sekunder siden begyndelsen af unix-epoken):
$ date +%s 1291679934
- få antallet af sekunder i 1125 dage
$ echo "1125 * 24 * 60 *60" | bc 97200000
-
trækker det ene fra det andet (1291679934 – 97200000) = 1194478815
-
brug den nye unixtime (1194478815) til at udskrive en smuk dato
$ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500
-
Som et alternativ på solaris du kan gøre dette for at udskrive datoen *:
/bin/echo "0t1194478815>Y\n<Y=Y" |adb
* der henvises til fra http://www.sun.com/bigadmin/shellme/
Et alternativ på Solaris til at hente det aktuelle tidsstempel fra dato-kommandoen ** er også:
/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"
** henvist til fra http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris
Kommentarer
Svar
Forrige svar var alt for kompliceret. FreeBSD / macOS har -v
flag for date
, fra MAN-siden (forkortet beskrivelse):
Juster (dvs. tag den aktuelle dato og vis resultatet af justeringen; ikke faktisk indstille datoen) det andet, minut, time, månedsdag, ugedag, måned eller år efter val. Forud for valget med et plus- eller minustegn justeres datoen frem eller tilbage i henhold til den resterende streng, ellers indstilles den relevante del af datoen. Datoen kan justeres så mange gange som nødvendigt ved hjælp af disse flag. Flag behandles i den angivne rækkefølge.
Så til dit formål gør date -v1125d
simpelthen det, du har brug for
$ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT
Svar
Jeg havde et lignende problem, jeg fandt dateutils pkg til OpenBSD 6.4. Det var en simpel pkg_add dateutils for mig.
#!/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
Min udlagde her er
#2018.11
UPDATE 1
Jeg kører denne kommando den 2018.12.10
HostNameHere# dadd date -1125d -f "%Y.%m"
Resultat
2015.11
Det understøtter enhver tid tilføjelse eller subtraktion, som jeg kan fortælle. Her er kommandoernes hjælp til at udskrive. #dadd -h
(dette er ikke hele udskriften. Der er mere info om muligheder.
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
Her er kommandoerne.
Her er formateringsmulighederne.
Kommentarer
- (1) Det ‘ er dejligt, at dette program understøtter
-1mo
. Kan du demonstrere, at det giver brugeren mulighed for at beregne datoen fra 1125 dage siden, som spørgsmålet stilles? (2) Spørgsmålet siger ” ved hjælp af basen operativsystem (f.eks. No Perl eller Python). ” Det ser ud til at udelukke tilføjelse af en ny pakke. - @ G-Man Tak for kommentaren. Jeg er ny på at bidrage på StackExchange. Tak for hjælp. Se UPDATE 1
%s
ogdate -r
er BSDismer (fra de meget tidlige dage, så de ‘ er på alle BSD-platforme). Må ikke ‘ ikke forvente at se dem på System V-platforme (f.eks. Har Solaris ingen af dem).