Beräkna datumet för 1125 dagar sedan på icke-GNU-system?

På Unix Bash-kommandoraden vill jag beräkna datumet från 1125 dagar sedan med basoperativsystemet (t.ex. No Perl eller Python).

På system som kör GNU Date kan jag göra något liknande:

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

FreeBSD- eller MacOSX-system levereras inte med GNU Date och stöder inte värden som ”X dagar sedan”.

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

I kan beräkna ett datum från några dagar sedan på ett Mac- eller FreeBSD-system, men detta är begränsat till några dagar:

# 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 jag beräkna gamla datum på icke-GNU-system utan att gå in i verktyg som Perl eller Python? Eller måste jag använda ett kraftfullare skriptspråk?

Svar

Nåväl, du kan göra något lömskt som:

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

Testat på OpenBSD (definitivt icke gnu-baserat datum) och verkar fungera.

Att dela upp det i steg:

  • få aktuell unixtime (sekunder sedan unix-epoken började):
 $ date +%s 1291679934 
  • få antalet sekunder 1125 dagar
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • subtraherar varandra (1291679934 – 97200000) = 1194478815

  • använd den nya unixtime (1194478815) för att skriva ut ett vackert datum

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Som ett alternativ, på solaris du kan göra detta för att skriva ut datumet *:

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

* refererad från http://www.sun.com/bigadmin/shellme/

Ett alternativ på Solaris för att få den aktuella tidsstämpeln från datumkommandot ** är:

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

** refererad från http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Kommentarer

  • Observera att %s och date -r är BSDism (från de allra första dagarna, så de ’ finns på alla BSD-plattformar). Räkna inte med ’ att se dem på System V-plattformar (t.ex. Solaris har ingen).
  • Ah, Solaris, hur jag älskar dig … (;
  • @ Gilles: Är du säker? Solaris har en mängd bin-kataloger, till exempel / usr / ucb / bin, som innehåller versioner från andra varianter av unix. SunOS 4.X var trots allt BSD-baserat.
  • Detta misslyckas när någon av de mellanliggande dagarna har mer eller mindre än 60 * 60 * 24 sekunder, till exempel språngsekunder och kalenderändringar.
  • @Sparr: Bra poäng. Ett säkert tillvägagångssätt är att subtrahera den aktuella tiden på dagen från det aktuella absoluta datumet och lägga till 12 * 60 * 60. Detta returnerar en tid på dagen mellan 10:59 och 13:01. Lägg till 24-timmarsperioder till detta och erhålla motsvarande datum är säkert.

Svar

Tidigare svar var alldeles för komplicerat. FreeBSD / macOS har -v flagga för date, från MAN-sidan (förkortad beskrivning):

Justera (dvs ta det aktuella datumet och visa resultatet av justeringen; inte faktiskt ställa in datum) andra, minut, timme, månadsdag, veckodag, månad eller år enligt val. Om val föregås av ett plus- eller minustecken justeras datumet framåt eller bakåt enligt den återstående strängen, annars ställs relevant del av datumet in. Datumet kan justeras så många gånger som krävs med hjälp av dessa flaggor. Flaggor bearbetas i den angivna ordningen.

Så för ditt ändamål gör date -v1125d helt enkelt vad du behöver

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

Svar

Jag hade ett liknande problem jag hittade dateutils pkg för OpenBSD 6.4. Det var en enkel pkg_add dateutils för 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 utlägg här är

#2018.11 

UPPDATERING 1

Jag kör det här kommandot 2018.12.10

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

Resultat

 2015.11 

Det stöder alla tillägg eller subtraktioner som jag kan säga. Här är kommandona för att skriva ut. #dadd -h (detta är inte hela utskriften. Det finns mer information om alternativ.

 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 

Här är kommandona.

Här finns formateringsalternativen.

Kommentarer

  • (1) Det ’ är trevligt att detta program stöder -1mo. Kan du visa att det tillåter användaren att beräkna datumet för 1125 dagar sedan, som frågan ställer? (2) Frågan säger ” med basen operativsystem (t.ex. Ingen Perl eller Python). ” Det verkar utesluta att ett nytt paket läggs till.
  • @ G-Man Tack för kommentaren. Jag är ny på att bidra på StackExchange. Tack för hjälpen. Se UPPDATERING 1

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *