Vypočítat datum před 1125 dny v systémech jiných než GNU?

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

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

  • Upozorňujeme, že %s a date -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á).
  • Ach, Solaris, jak tě miluji … (;
  • @Gilles: Jste si jisti? Solaris má mnoho adresářů bin, jako je / usr / ucb / bin, které obsahují verze z jiných variant unixu. SunOS 4.X byl koneckonců založen na BSD.
  • To selže, když některý z intervenujících dnů má více než 60 * 60 * 24 sekund, například přestupné sekundy a změny v kalendáři.
  • @Sparr: Dobrá poznámka. Bezpečné přístup je odečíst aktuální čas dne od aktuálního absolutního data a přidat 12 * 60 * 60. Tím se vrací čas dne mezi 10:59 a 13:01. Přidáním 24hodinových období k tomuto a získáním odpovídající datum je bezpečné.

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *