Na příkazovém řádku Unix Bash chci pomocí základního operačního systému (např. No Perl nebo Python) vypočítat datum z doby před 1125 dny.
V systémech se systémem GNU Date mohu udělat něco takového:
ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007
Systémy FreeBSD nebo MacOSX se nedodávají s GNU Date a nepodporují hodnoty jako „Před X dny“.
freebsd81 $ date --date="+1125 days ago" date: illegal option -- -
Já lze vypočítat datum z doby před několika dny v systému Mac nebo FreeBSD, ale toto je omezeno na několik dní:
# 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
Mohu vypočítat stará data na systémech jiných než GNU, aniž byste se ponořili do nástrojů jako Perl nebo Python? Nebo musím použít silnější skriptovací jazyk?
Odpovědět
No, můžete udělat něco záludného jako:
$ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500
Testováno na OpenBSD (rozhodně není založeno na gnu) a zdá se, že funguje.
Rozdělení v krocích:
- získejte aktuální unixtime (sekundy od začátku epochy unixu):
$ date +%s 1291679934
- získejte počet sekund v 1125 dny
$ echo "1125 * 24 * 60 *60" | bc 97200000
-
odečíst jeden od druhého (1291679934 – 97200000) = 1194478815
-
použijte nový unixtime (1194478815) k vytištění hezkého data
$ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500
-
Alternativně lze na solaris můžete to udělat pro tisk data *:
/bin/echo "0t1194478815>Y\n<Y=Y" |adb
* odkaz z http://www.sun.com/bigadmin/shellme/
Alternativou pro získání aktuálního časového razítka z příkazu date ** v systému Solaris je:
/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"
** odkaz z http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris
Komentáře
Odpověď
Předchozí odpověď byla příliš komplikovaná. FreeBSD / macOS mají -v
příznak pro date
ze stránky MAN (zkrácený popis):
Upravit (tj. vzít aktuální datum a zobrazit výsledek úpravy; není ve skutečnosti nastaveno datum) druhý, minuta, hodina, měsíc den, den v týdnu, měsíc nebo rok podle val. Pokud před val předchází znaménko plus nebo minus, je datum upraveno dopředu nebo dozadu podle zbývajícího řetězce, jinak je nastavena příslušná část data. Pomocí těchto příznaků lze datum upravit tolikrát, kolikrát je třeba. Vlajky se zpracovávají v uvedeném pořadí.
Takže pro vaše účely date -v1125d
jednoduše udělá to, co potřebujete
$ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT
odpověď
Měl jsem podobný problém, našel jsem dateutils pkg pro OpenBSD 6.4. Byl to pro mě jednoduchý pkg_add dateutils.
#!/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
Můj výstup je zde
#2018.11
UPDATE 1
Tento příkaz spouštím 2018.12.10
HostNameHere# dadd date -1125d -f "%Y.%m"
Výsledek
2015.11
Podporuje jakákoli časová sčítání nebo odčítání, která poznám. Zde jsou příkazy, které vám pomohou vytisknout. #dadd -h
(nejedná se o celý výtisk. Existuje více informací o možnostech.
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
Zde jsou příkazy.
Zde jsou možnosti formátování.
Komentáře
- (1) Je ‚ hezké, že tento program podporuje
-1mo
. Můžete prokázat, že umožňuje uživateli vypočítat datum před 1125 dny, jak se ptá otázka? (2) Otázka říká “ pomocí základny operační systém (např. No Perl nebo Python). “ Zdá se, že to vylučuje přidání nového balíčku. - @ G-Man Děkuji za komentář. Jsem nový v přispívání na StackExchange. Děkuji ti za pomoc. Viz UPDATE 1
%s
adate -r
jsou BSDizmy (od samého počátku, takže ‚ re na všech platformách BSD). Neočekávejte ‚, že je uvidíte na platformách System V (např. Solaris žádné nemá).