Beregn datoen fra 1125 dager siden på ikke-GNU-systemer?

På Unix Bash-kommandolinjen vil jeg beregne datoen fra 1125 dager siden ved hjelp av basisoperativsystemet (f.eks. No Perl eller Python).

På systemer som kjører GNU Date , kan jeg gjøre noe slikt:

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

FreeBSD- eller MacOSX-systemer leveres ikke med GNU Date, og støtter ikke verdier som «X dager siden».

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

I kan beregne en dato for noen dager siden på et Mac eller FreeBSD-system, men dette er begrenset til noen få dager:

# 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 uten å fordype seg i verktøy som Perl eller Python? Eller må jeg bruke et kraftigere skriptspråk?

Svar

Vel, du kan gjøre noe lurt som:

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

Testet på OpenBSD (definitivt ikke GNU-basert dato), og ser ut til å fungere.

Fordeling av trinn:

  • få gjeldende unixtime (sekunder siden begynnelsen av unix-epoken):
 $ date +%s 1291679934 
  • få antall sekunder i 1125 dager
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • trekker den ene fra den andre (1291679934 – 97200000) = 1194478815

  • bruk den nye unixtime (1194478815) til å skrive ut en pen dato

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Som et alternativ, på solaris du kan gjøre dette for å skrive ut datoen *:

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

* referert fra http://www.sun.com/bigadmin/shellme/

Også et alternativ på Solaris for å få gjeldende tidsstempel fra dato-kommandoen ** er:

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

** referert fra http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Kommentarer

  • Merk at %s og date -r er BSDismer (fra de aller første dager, så de ‘ er på alle BSD-plattformer). Ikke forvent ‘ å se dem på System V-plattformer (f.eks. Har Solaris ingen av dem).
  • Ah, Solaris, hvordan jeg elsker deg … (;
  • @ Gilles: Er du sikker? Solaris har en rekke bin-kataloger, for eksempel / usr / ucb / bin, som inneholder versjoner fra andre varianter av unix. SunOS 4.X var tross alt BSD-basert.
  • Dette mislykkes når noen av de mellomliggende dagene har mer eller mindre enn 60 * 60 * 24 sekunder, for eksempel sprangsekunder og kalenderendringer.
  • @Sparr: Bra poeng. Et trygt tilnærming er å trekke dagens klokkeslett fra gjeldende absolutt dato, og legge til 12 * 60 * 60. Dette returnerer en tid på dagen mellom 10:59 og 13:01. Legger til 24-timersperioder til dette og oppnår tilsvarende dato er trygg.

Svar

Forrige svar var altfor komplisert. FreeBSD / macOS har -v flagg for date, fra MAN-siden (forkortet beskrivelse):

Juster (dvs. ta gjeldende dato og vis resultatet av justeringen; faktisk ikke angi datoen) andre, minutt, time, månedsdag, ukedag, måned eller år i henhold til val. Hvis valget er foran med et pluss- eller minustegn, justeres datoen forover eller bakover i henhold til den gjenværende strengen, ellers blir den aktuelle delen av datoen satt. Datoen kan justeres så mange ganger som nødvendig ved hjelp av disse flaggene. Flagg behandles i den angitte rekkefølgen.

Så for ditt formål vil date -v1125d bare gjøre det du trenger

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

Svar

Jeg hadde et lignende problem, jeg fant dateutils pkg for OpenBSD 6.4. Det var en enkel pkg_add dateutils for meg.

#!/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 utplassering her er

#2018.11 

UPDATE 1

Jeg kjører denne kommandoen 2018.12.10

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

Resultat

 2015.11 

Den støtter når som helst tillegg eller subtraksjoner som jeg kan fortelle. Her er kommandoene som hjelper til med å skrive ut. #dadd -h (dette er ikke hele utskriften. Det er mer info om valg.

 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 kommandoene.

Her er formateringsalternativene.

Kommentarer

  • (1) Det ‘ er hyggelig at dette programmet støtter -1mo. Kan du demonstrere at det tillater brukeren å beregne datoen fra 1125 dager siden, slik spørsmålet stiller? (2) Spørsmålet sier » ved hjelp av basen operativsystem (f.eks. No Perl eller Python). » Det ser ut til å utelukke å legge til en ny pakke.
  • @ G-Man Takk for kommentaren. Jeg er ny på å bidra på StackExchange. Takk for hjelpen. Se OPPDATERING 1

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *