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
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
%s
endate -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).