Bereken de datum van 1125 dagen geleden op niet-GNU-systemen?

Op de Unix Bash-opdrachtregel wil ik de datum van 1125 dagen geleden berekenen met behulp van het basisbesturingssysteem (bijv. Geen Perl of Python).

Op systemen met GNU Date , kan ik zoiets als dit doen:

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

FreeBSD- of MacOSX-systemen worden niet geleverd met GNU Date en ondersteunen geen waarden als “X dagen geleden”.

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

I kan een datum berekenen van een paar dagen geleden op een Mac of FreeBSD-systeem, maar dit is beperkt tot een paar dagen:

# 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 

Mag ik oude datums berekenen op niet-GNU-systemen zonder je te verdiepen in tools zoals Perl of Python? Of moet ik een krachtigere scripttaal gebruiken?

Answer

Nou, je kunt iets stiekem doen, zoals:

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

Getest op OpenBSD (zeker niet op GNU gebaseerde datum), en lijkt te werken.

Het opsplitsen in stappen:

  • haal de huidige unixtime op (seconden sinds het begin van de unix-epoche):
 $ date +%s 1291679934 
  • verkrijg het aantal seconden in 1125 dagen
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • trek de ene van de andere af (1291679934 – 97200000) = 1194478815

  • gebruik de nieuwe unixtime (1194478815) om een mooie datum af te drukken

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Als alternatief, op solaris u kunt dit doen om de datum af te drukken *:

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

* waarnaar wordt verwezen vanaf http://www.sun.com/bigadmin/shellme/

Een alternatief op Solaris voor het ophalen van de huidige tijdstempel van het date-commando ** is:

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

** verwezen vanuit http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Reacties

  • Houd er rekening mee dat %s en date -r BSDisms zijn (uit het allereerste begin, dus ‘ re op alle BSD-platforms). Verwacht niet ‘ ze te zien op System V-platforms (bijv. Solaris heeft geen van beide).
  • Ah, Solaris, wat hou ik van je … (;
  • @Gilles: Weet je het zeker? Solaris heeft een groot aantal bin-directorys, zoals / usr / ucb / bin, die versies bevatten van andere variaties van unix. SunOS 4.X was tenslotte BSD-gebaseerd.
  • Dit mislukt wanneer een van de tussenliggende dagen meer of minder dan 60 * 60 * 24 seconden heeft, zoals schrikkelseconden en kalenderwijzigingen.
  • @Sparr: Goed punt. Een kluis benadering is om de huidige tijd van de dag af te trekken van de huidige absolute datum en 12 * 60 * 60 toe te voegen. Dit retourneert een tijd van de dag tussen 10:59 en 13:01. Hieraan worden perioden van 24 uur toegevoegd en de bijbehorende datum is veilig.

Answer

Vorige antwoord was veel te ingewikkeld. FreeBSD / macOS hebben de -v vlag voor date, van de MAN-pagina (afgekorte beschrijving):

Aanpassen (d.w.z. neem de huidige datum en toon het resultaat van de aanpassing; niet echt de datum instellen) de seconde, minuut, uur, maand dag, weekdag, maand of jaar volgens val. Als val wordt voorafgegaan door een plus- of minteken, wordt de datum naar voren of naar achteren aangepast volgens de resterende tekenreeks, anders wordt het relevante deel van de datum ingesteld. Met deze vlaggen kan de datum zo vaak als nodig worden aangepast. Vlaggen worden verwerkt in de opgegeven volgorde.

Dus voor uw doel doet date -v1125d gewoon wat u nodig heeft

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

Answer

Ik had een soortgelijk probleem, ik vond de dateutils pkg voor OpenBSD 6.4. Het was een simpele pkg_add dateutils voor mij.

#!/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 

Mijn uitgang hier is

#2018.11 

UPDATE 1

Ik voer deze opdracht uit op 2018.12.10

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

Resultaat

 2015.11 

Het ondersteunt alle mogelijke toevoegingen of aftrekkingen die ik kan zien. Hier zijn de commandos die helpen bij het afdrukken. #dadd -h (dit is niet de volledige afdruk. Er is meer informatie over opties.

 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 

Hier zijn de commandos.

Hier zijn de opmaakopties.

Reacties

  • (1) Het is ‘ aardig dat dit programma . Kunt u aantonen dat de gebruiker de datum van 1125 dagen geleden kan berekenen, zoals de vraag stelt? (2) De vraag zegt ” met behulp van de basis besturingssysteem (bijv. Geen Perl of Python). ” Dat lijkt het toevoegen van een nieuw pakket te beletten.
  • @ G-Man Bedankt voor de reactie. Ik ben nieuw bij het bijdragen aan StackExchange. Bedankt voor de hulp. Zie UPDATE 1

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *