Beregn datoen for 1125 dage siden på ikke-GNU-systemer?

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

  • Bemærk at %s og date -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).
  • Ah, Solaris, hvordan jeg elsker dig … (;
  • @ Gilles: Er du sikker? Solaris har en lang række bin-kataloger, såsom / usr / ucb / bin, der indeholder versioner fra andre varianter af unix. SunOS 4.X var trods alt BSD-baseret.
  • Dette mislykkes, når nogen af de mellemliggende dage har mere eller mindre end 60 * 60 * 24 sekunder, såsom skuddsekunder og kalenderændringer.
  • @Sparr: Godt punkt. Et sikkert tilgang er at trække det aktuelle tidspunkt på dagen fra den aktuelle absolutte dato og tilføje 12 * 60 * 60. Dette returnerer en tid på dagen mellem 10:59 og 13:01. Tilføjelse af 24-timers perioder til dette og opnåelse af den tilsvarende dato er sikker.

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *