Kiszámítja az 1125 nappal ezelőtti dátumot nem GNU rendszereken?

A Unix Bash parancssorban ki szeretném számítani az 1125 nappal ezelőtti dátumot az alap operációs rendszer használatával (pl. No Perl vagy Python).

A GNU dátumot futtató rendszereken ilyet tudok tenni:

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

A FreeBSD vagy a MacOSX rendszerek nem szállítják a GNU Date dátummal, és nem támogatnak olyan értékeket, mint az “X nappal ezelőtt”.

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

I ki tudja számolni a néhány nappal ezelőtti dátumot Mac vagy FreeBSD rendszeren, de ez csak néhány napra korlátozódik:

# 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 

Tudok kiszámolja a régi dátumokat nem GNU rendszereken anélkül, hogy elmélyülne olyan eszközökben, mint a Perl vagy a Python? Vagy erősebb szkriptnyelvet kell használnom?

Válasz

Nos, valami alattomos dolgot is megtehet, például:

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

OpenBSD-n tesztelve (határozottan nem gnu alapú dátum), és úgy tűnik, hogy működik.

Bontás lépésenként:

  • az aktuális unixtime megszerzése (másodperc az unix korszak kezdete óta):
 $ date +%s 1291679934 
  • megkapja a másodpercek számát 1125-ben napok
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • kivonják egymást a másikból (1291679934 – 97200000) = 1194478815

  • az új unixtime (1194478815) segítségével szép dátumot nyomtathat

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Alternatív megoldásként a solaris-on ezt megteheti a dátum * kinyomtatásához:

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

* hivatkozva a http://www.sun.com/bigadmin/shellme/

Ezenkívül a Solaris egyik alternatívája az aktuális időbélyeg lekérésére a dátum parancsból **:

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

** hivatkozva erre: http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Megjegyzések

  • Ne feledje, hogy a %s és a date -r BSD-kórok (a kezdetektől fogva, tehát ‘ re minden BSD platformon). Ne ‘ ne várja, hogy láthassa őket a System V platformokon (pl. A Solarisnak egyikük sincs).
  • Ah, Solaris, hogy szeretlek … (;
  • @Gilles: Biztos vagy benne? A Solaris számos bin könyvtárral rendelkezik, például / usr / ucb / bin, amelyek az unix más variációinak verzióit tartalmazzák. A SunOS 4.X végül is BSD-alapú volt.
  • Ez nem sikerül, ha a közbeeső napok bármelyikének több mint 60 * 60 * 24 másodperc van, például szökőmásodpercek és naptárváltozások.
  • @Sparr: Jó pont. Biztonságos megközelítés az, hogy az aktuális napszakot kivonjuk az aktuális abszolút dátumból, és hozzáadjuk a 12 * 60 * 60 értéket. Ez 10: 59 és 13: 01 közötti napszakot ad vissza. Ehhez 24 órás periódusokat adunk, és megkapjuk a a megfelelő dátum biztonságos.

Válasz

Az előző válasz túl bonyolult volt. A FreeBSD / macOS -v zászló a date számára a MAN oldalról (rövidített leírás):

Beállítás (azaz vegye fel az aktuális dátumot, és jelenítse meg a kiigazítás eredményét; valójában nem állítja be a dátumot) a második, perc, óra, hónap napja, hét napja, hónap vagy év a val. Ha a val előtt plusz vagy mínusz előjel szerepel, a dátumot előre vagy hátra állítják a fennmaradó karakterláncnak megfelelően, ellenkező esetben a dátum megfelelő részét állítják be. A dátum ezeket a jelzőket használva annyiszor módosíthatja, amennyire csak szükséges. A megjelöléseket a megadott sorrendben dolgozzuk fel.

Tehát az Ön célja érdekében a date -v1125d egyszerűen megteszi, amire szüksége van

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

Válasz

Hasonló problémám volt, találtam a dateutils pkg az OpenBSD 6.4-hez. Egyszerű pkg_add dateutils volt számomra.

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

Ide kerültem:

#2018.11 

UPDATE 1

Ezt a parancsot 2018.12.10-én futtatom

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

Eredmény

 2015.11 

Támogat minden időbeli összeadást vagy kivonást, amit el tudok mondani. Itt találhatók a parancsok a nyomtatáshoz. #dadd -h (ez nem a teljes nyomtatás. További információk találhatók az opciókról.

 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 

Itt a parancsok találhatók.

Itt a formázási lehetőségek találhatók.

Megjegyzések

  • (1) ‘ jó, hogy ez a program támogatja a -1mo. Meg tudja bizonyítani, hogy ez lehetővé teszi a felhasználó számára, hogy kiszámolja az 1125 nappal ezelőtti dátumot, amint a kérdés felteszi? (2) A kérdés a ” kifejezést használja az alap használatával operációs rendszer (pl. No Perl vagy Python). ” Úgy tűnik, ez kizárja az új csomag hozzáadását.
  • @ G-Man Köszönöm a megjegyzést. Új vagyok a StackExchange szolgáltatásban. Köszönöm a segítséget. Lásd: 1. FRISSÍTÉS

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük