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ą.
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'
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
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.
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.
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.
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ę:
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""$@"
Odpowiedzi:
To powinno działać:
źródło
%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 wbudowanybash
, więc twoja wersjabash
nie ma nic wspólnego zdate
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.).
Przelicz liczbę sekund z powrotem na datę
Polecenie
date
jest dość wszechstronne. Kolejna fajna rzecz, którą możesz zrobić z datą (bezwstydnie skopiowane zdate --help
). Pokaż czas lokalny o 9:00 w następny piątek na zachodnim wybrzeżu USAJeszcze lepiej, poświęć trochę czasu na przeczytanie strony podręcznika http://man7.org/linux/man-pages/man1/date.1.html
źródło
date
lub ponieważ używamzsh
(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 przezdateformat
, obsługiwany przezstrftime(3)
(man 3 strftime
informacje o formatach).Tak więc, dla czystego rozwiązania Bash:
lub jeśli chcesz zapisać wynik w zmiennej
var
:Brak zewnętrznych programów i podpowłoki!
Od wersji Bash 4.3 można nawet nie określać
-1
:(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źródło
-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:
źródło
srand()
są zwykle zapełniane bieżącą datą / godziną. Drugie wywołaniesrand()
zwracające wartość poprzednio używaną jako ziarno.Rozwiązanie Pure Bash
Od wersji
bash
5.0 ( wydanej 7 stycznia 2019 r. ) Możesz używać wbudowanej zmiennejEPOCHSECONDS
.Jest też to,
EPOCHREALTIME
co obejmuje ułamki sekund.EPOCHREALTIME
można zamienić na mikrosekundy (μs), usuwając przecinek dziesiętny. Może to być interesujące w przypadku korzystaniabash
z wbudowanej arytmetyki,(( expression ))
która może obsługiwać tylko liczby całkowite.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.
źródło
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.)
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ę:
Strona podręcznika Apple dotycząca implementacji daty: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
źródło
date
polecenie BSD , podczas gdy wszelkie sugerowane rozwiązaniadate -d
dotyczą GNUdate
. 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ę nastrftime(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.użyj tego skryptu bash (mój
~/bin/epoch
):źródło