Potrebujem nejako použiť príkaz date v bash alebo iný nástroj na vytlačenie dátumu a času, 5 minút pred a 5 minút po danej hodnote. Napríklad:
vstup:
Thu Dec 19 14:10
výkon:
Thu Dec 19 14:05 Thu Dec 19 14:10 Thu Dec 19 14:15
Vidím, že date
príkaz sa dá použiť na vykonanie aktuálneho dátumu / času, môže sa použiť s odovzdanou hodnotou, t. j. nie aktuálnym dátumom / časom?
odpovede:
13 pre odpoveď č. 1Môžete to dosiahnuť aktuálnym časom zadaním.
$ date --date="5 minutes ago"; date; date --date="5 minutes"
Qui Dez 19 16:09:17 BRST 2013
Qui Dez 19 16:14:17 BRST 2013
Qui Dez 19 16:19:17 BRST 2013
Použiť konkrétny dátum (ex 1978/01/10).
$ date --date="1978-01-10 + 5 minutes"
Ter Jan 10 00:05:00 BRT 1978
6 pre odpoveď č. 2
S GNU date
, s argumentom pre. môžete urobiť jednoduchú formu aritmetiky dátumu a času --date
option:
$ date --date "now + 5 minutes"
S BSD date
(aspoň verzia dodávaná so systémom Mac OS X), -v
možnosť umožňuje robiť niečo podobné, ale iba s aktuálnym časom:
$ date -v +5M
$ date -v -5M
V opačnom prípade musíte matematiku vykonať explicitne po prevode času na časovú pečiatku systému UNIX (sekundy od 1. januára 1970):
$ date -r $(( $(date +%s) + 300 )) # 5 minutes (300 seconds) from now
$ date -r $(( $(date +%s) - 300 )) # 5 minutes ago
3 pre odpoveď № 3
Ak používate bash pod Linuxom, môžete použiť -d
parameter na vykonanie manipulácie s dátumom na existujúce dátum:
Získajte čas EPOCH pre príslušný dátum:
EPOCH=$(date -d "Thu Dec 19 14:10" "+%s")
To vám dá čas, v sekundách, od EPOCH (zvyčajne 01.01.1970)
Teraz môžete pomocou jednoduchej matematiky odpočítať alebo pridať k času EPOCH 5 minút (v sekundách)
NEW_EPOCH=$(($EPOCH - 300))
očividne existuje 300 sekúnd za 5 minút
Teraz skonvertujte tento NEW_EPOCH späť na ľudsky čitateľný dátum
NEW_DATE=$(date -d "1970-01-01 ${NEW_EPOCH} sec")
POZNÁMKA: toto funguje iba na unixových systémoch, ktoré podporujú voľbu date -d (t. J. Linux)
0 pre odpoveď č. 4
Ak to chcete urobiť pre aktuálny čas +/- 5 minút a používate program Bash 4.2 alebo novší, môžete tak urobiť bez externých nástrojov:
$ printf -v now "%(%s)T"
$ echo "$now"
1516161094
$ f="%a %b %d %R"
$ printf "%($f)T %($f)T %($f)Tn" "$((now-300))" "$now" "$((now+300))"
Tue Jan 16 22:46 Tue Jan 16 22:51 Tue Jan 16 22:56
Na %(datefmt)T
formátovací reťazec printf
umožňuje tlačiť reťazce dátum-čas. Ak je argument vynechaný (napríklad tu) alebo je -1
, použije sa aktuálny čas.
%s
- formátuje čas v sekundách od epochy a - -v now
uloží výstup do now
namiesto tlače.
f
je iba výhodná premenná, takže nemusím trikrát opakovať formátovací reťazec pre výstup.
Od argumentu pre toto použitie printf
musí byť v epizóde od epochy, ste zaseknutí s externými nástrojmi na prevod vstupného reťazca ako Thu Dec 19 14:10
do tohto formátu a vy by ste ich nahradili
printf -v now "%(%s)T"
napríklad s ktorýmkoľvek z
now=$(date "+%s" -d "Thu Dec 19 14:10") # GNU date
now=$(date -j -f "%a %b %d %T" "Thu Dec 19 14:10" "+%s") # macOS date