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