Uzyskaj aktualny czas w sekundach od Epoki w systemie Linux, Bash

633

Potrzebuję czegoś prostego date, ale w ciągu kilku sekund od 1970 roku zamiast bieżącej daty, godzin, minut i sekund.

datenie wydaje się oferować tej opcji. Czy istnieje prosty sposób?

n-Alexander
źródło
22
Przepraszam, muszę to powiedzieć ... - Wydaje się, że data nie oferuje tej opcji. Czy istnieje prosty sposób? '' - przeczytaj ponownie instrukcję ;-)
TheBonsai
7
Niektóre wersje mają go, a niektóre nie. Więc nie zawsze jest obecny. Uruchomiłem „type -a date” i użyłem innej wersji, która działała.
Scott Rowley,
1
FWIW, Ubuntu ma tylko / bin / date, na które działa odpowiedź @ Steefa
Jonathan Hartley
1
@ TheBonsai, który nie jest częścią standardowej wersji narzędzia „data” POSIX. Tylko dlatego, że twoja wersja go ma (prawdopodobnie GNU), nie powinieneś zakładać, że wszyscy ją wykonują.
Wyatt8740,

Odpowiedzi:

1159

To powinno działać:

date +%s
Steef
źródło
45
data manpge powinna zostać zmieniona z %s seconds since 1970-01-01 00:00:00 UTCna, %s seconds since the epoch, 1970-01-01 00:00:00 UTCponieważ tam tęskniłem.
devin,
3
Nie działa dla mnie. data człowieka nie pokazuje% s. Muszę mieć bardzo starą wersję bash (3.2.51 (1) dla Solaris)?
livefree75
7
@ livefree75 datenie jest wbudowany bash, więc twoja wersja bashnie ma nic wspólnego z dateimplementacją, z którą dostarczany jest twój system.
Adrian Frühwirth
11
A jeśli chcesz ułamki sekundy, do 9 miejsc po przecinku, użyj:date +%s.%N
Jonathan Hartley
19
Dla milisekund użyjdate +%s%3N
Juan Campa,
133

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

pellucide
źródło
To nie jest pytanie PO, ale odpowiada moje, więc daj +1 ode mnie.
AnthonyD973,
Może to wersja datelub ponieważ używam zsh(macOS Catalina), ale to nie działa dla mnie. Uruchomione $ date -d "Oct 21 1973" +%swyjściausage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter
43

Jak dotąd wszystkie odpowiedzi wykorzystują program zewnętrzny date.

Od wersji Bash 4.2 printfma nowy modyfikator, %(dateformat)Tktóry w przypadku użycia z argumentem -1wyś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 -2jako 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
gniourf_gniourf
źródło
9
Chcesz użyć, -2jeś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ąć, -2unikając przechowywania dedykowana zmienna na początku.
Sebastian J.
23

W przypadku większości implementacji Awk:

awk 'BEGIN {srand(); print srand()}'
Steven Penny
źródło
21
Wow, co jest niejasne
Ericlaw
8
Wow, musiałem to sprawdzić. Jest to pragmatyczne rozwiązanie, ale niekoniecznie dobre / przenośne. Wydaje się, że implementacje awksrand() są zwykle zapełniane bieżącą datą / godziną. Drugie wywołanie srand()zwracające wartość poprzednio używaną jako ziarno.
Ryan Ransford,
23

Rozwiązanie Pure Bash

Od wersji bash5.0 ( wydanej 7 stycznia 2019 r. ) Możesz używać wbudowanej zmiennej EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

Jest też to, EPOCHREALTIMEco obejmuje ułamki sekund.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEmożna zamienić na mikrosekundy (μs), usuwając przecinek dziesiętny. Może to być interesujące w przypadku korzystania bashz 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.

Socowi
źródło
Aby uzyskać rozdzielczość milisekundową (taki sam format jak date +%s%3N), możesz użyćecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212
19

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

PeqNP
źródło
1
Dla jasności, jest to datepolecenie BSD , podczas gdy wszelkie sugerowane rozwiązania date -ddotyczą 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.
ghoti
brak %Nopcji 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.
Dan Pritts
1

użyj tego skryptu bash (mój ~/bin/epoch):

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
comonad
źródło