Potrzebuję czegoś prostego date
, ale w ciągu kilku sekund od 1970 roku zamiast bieżącej daty, godzin, minut i sekund.
date
nie wydaje się oferować tej opcji. Czy istnieje prosty sposób?
Potrzebuję czegoś prostego date
, ale w ciągu kilku sekund od 1970 roku zamiast bieżącej daty, godzin, minut i sekund.
date
nie wydaje się oferować tej opcji. Czy istnieje prosty sposób?
Odpowiedzi:
To powinno działać:
date +%s
%s seconds since 1970-01-01 00:00:00 UTC
na, %s seconds since the epoch, 1970-01-01 00:00:00 UTC
ponieważ tam tęskniłem.
date
nie jest wbudowany bash
, więc twoja wersja bash
nie ma nic wspólnego z date
implementacją, z którą dostarczany jest twój system.
date +%s.%N
date +%s%3N
Tylko dodać.
Zdobądź sekundy od epoki (1 stycznia 1970 r.) Dla dowolnej daty (np. 21 października 1973 r.).
date -d "Oct 21 1973" +%s
Przelicz liczbę sekund z powrotem na datę
date --date @120024000
Polecenie date
jest dość wszechstronne. Kolejna fajna rzecz, którą możesz zrobić z datą (bezwstydnie skopiowane z date --help
). Pokaż czas lokalny o 9:00 w następny piątek na zachodnim wybrzeżu USA
date --date='TZ="America/Los_Angeles" 09:00 next Fri'
Jeszcze lepiej, poświęć trochę czasu na przeczytanie strony podręcznika http://man7.org/linux/man-pages/man1/date.1.html
date
lub ponieważ używam zsh
(macOS Catalina), ale to nie działa dla mnie. Uruchomione $ date -d "Oct 21 1973" +%s
wyjściausage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Jak dotąd wszystkie odpowiedzi wykorzystują program zewnętrzny date
.
Od wersji Bash 4.2 printf
ma nowy modyfikator, %(dateformat)T
który w przypadku użycia z argumentem -1
wyświetla aktualną datę w formacie podanym przez dateformat
, obsługiwany przez strftime(3)
(man 3 strftime
informacje o formatach).
Tak więc, dla czystego rozwiązania Bash:
printf '%(%s)T\n' -1
lub jeśli chcesz zapisać wynik w zmiennej var
:
printf -v var '%(%s)T' -1
Brak zewnętrznych programów i podpowłoki!
Od wersji Bash 4.3 można nawet nie określać -1
:
printf -v var '%(%s)T'
(ale mądrzej byłoby zawsze podawać argument -1
).
Jeśli użyjesz -2
jako argumentu zamiast -1
, Bash użyje czasu uruchomienia powłoki zamiast bieżącej daty. Można to wykorzystać do obliczenia upływających czasów
$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422
-2
jeśli masz dłużej działające zadanie (pomyśl o skrypcie, który kontroluje twoje kopie zapasowe) i na końcu wyślij wiadomość „Kopia zapasowa rozpoczęła się za $ gdzieś zakończona o $ teraz” - co można osiągnąć, -2
unikając przechowywania dedykowana zmienna na początku.
W przypadku większości implementacji Awk:
awk 'BEGIN {srand(); print srand()}'
srand()
są zwykle zapełniane bieżącą datą / godziną. Drugie wywołanie srand()
zwracające wartość poprzednio używaną jako ziarno.
Od wersji bash
5.0 ( wydanej 7 stycznia 2019 r. ) Możesz używać wbudowanej zmiennej EPOCHSECONDS
.
$ echo $EPOCHSECONDS
1547624774
Jest też to, EPOCHREALTIME
co obejmuje ułamki sekund.
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIME
można zamienić na mikrosekundy (μs), usuwając przecinek dziesiętny. Może to być interesujące w przypadku korzystania bash
z wbudowanej arytmetyki, (( expression ))
która może obsługiwać tylko liczby całkowite.
$ echo ${EPOCHREALTIME/./}
1547624774371215
We wszystkich przykładach z góry wydrukowane wartości czasu są równe dla lepszej czytelności. W rzeczywistości wartości czasu będą się różnić, ponieważ każde polecenie zajmuje trochę czasu.
date +%s%3N
), możesz użyćecho $(( ${EPOCHREALTIME/./} / 1000 ))
Jest to rozszerzenie tego, co zrobił @pellucide, ale dla komputerów Mac:
Aby określić liczbę sekund od epoki (1 stycznia 1970 r.) Dla dowolnej daty (np. 21 października 1973 r.)
$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800
Uwaga: dla kompletności dodałem część czasu do formatu. Powodem jest to, że date
weźmiesz dowolną część daty, którą mu podałeś i dodasz bieżącą podaną czas do podanej wartości. Na przykład, jeśli wykonasz powyższe polecenie o 16:19, bez części „00: 00: 00”, automatycznie doda czas. Tak, że „21 października 1973 r.” Zostanie przeanalizowany jako „21 października 1973 r. 16:19:00”. To może nie być to, czego chcesz.
Aby przekonwertować znacznik czasu z powrotem na datę:
$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973
Strona podręcznika Apple dotycząca implementacji daty: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
date
polecenie BSD , podczas gdy wszelkie sugerowane rozwiązania date -d
dotyczą GNU date
. Data BSD w macOS pochodzi z FreeBSD i udostępnia wiele opcji NetBSD i OpenBSD. I to jest całkowicie odrębne od bash.
%N
opcji wymienionej dla ułamków sekund w dacie GNU w dacie MacOS. W dniu 10.14 żaden z formatów nie znajduje się na stronie podręcznika; znajdują się na strftime(3)
stronie podręcznika , której nie będziesz mieć, jeśli nie masz zainstalowanego Xcode, i możesz nie widzieć polecenia man, nawet jeśli tak zrobisz.