Linux: ustaw datę za pomocą wiersza polecenia

76

Jak zmienić datę systemową w systemie Linux?

Chcę się zmienić:

  • Tylko rok
  • Tylko miesiąc
  • Tylko data
  • Dowolna kombinacja powyżej trzech
SHW
źródło
2
Możesz użyć np. date --set='-2 years'Do cofnięcia zegara o dwa lata, pozostawiając wszystkie pozostałe elementy identyczne. Możesz zmienić miesiąc i dzień miesiąca w ten sam sposób. Nie sprawdziłem, co się stanie, jeśli to obliczenie spowoduje, że data nie istnieje, np. Podczas przełączania DST, ale zachowanie powinno być identyczne z typowym zachowaniem „ustaw datę i godzinę na konkretne wartości”.
Christian Severin,
Zakładając, że próbujesz ustawić datę na bieżącą godzinę, możesz zrobić, sudo ntpd -gqaby system aktualizował się automatycznie przy użyciu usługi NTTP.
Steven Soroka

Odpowiedzi:

95

Użyj date -s:

date -s '2014-12-25 12:34:56'

Uruchom jako root lub under sudo. Zmiana tylko jednego roku / miesiąca / dnia stanowi większe wyzwanie i będzie wymagała powtarzania bitów z bieżącej daty. Istnieją również narzędzia graficzne GUI wbudowane w główne środowiska pulpitu, zwykle dostępne przez całą dobę.

Aby zmienić tylko część czasu, możesz użyć podstawienia polecenia w ciągu daty:

date -s "2014-12-25 $(date +%H:%M:%S)"

zmieni datę, ale zachowaj czas. Zobacz man dateformatowania szczegółów skonstruować inne kombinacje: poszczególne elementy są %Y, %m, %d, %H, %M, i %S.

Michael Homer
źródło
Nie chcę zmieniać czasu
SHW
5
Nie ma takiej możliwości. Możesz jednak użyć date -s "2014-12-25 $(date +%H:%M:%S)"do zmiany daty i ponownego wykorzystania bieżącej godziny.
Michael Homer,
przybył tutaj, godziny i minuty pasowały do ​​aktualnego czasu. - fajnie
Alex2php
2
date: cannot set date: Invalid argument
Chris Stryczyński
@MichaelHomer @SHW można zmienić tylko datę za pomocą polecenia takiego jak date -s 2018-01-01. Ktoś udostępnił to w odpowiedzi również: superuser.com/questions/870068/…
baptx
42

czas systemu

Możesz użyć, dateaby ustawić datę systemową. Implementacja GNU date(jak w większości niewbudowanych systemów opartych na Linuksie) akceptuje wiele różnych formatów, aby ustawić czas, oto kilka przykładów:

ustaw tylko rok:

date -s 'next year'
date -s 'last year'

ustaw tylko miesiąc:

date -s 'last month'
date -s 'next month'

ustaw tylko dzień:

date -s 'next day'
date -s 'tomorrow'
date -s 'last day'
date -s 'yesterday'
date -s 'friday'

zestaw wszystko razem:

date -s '2009-02-13 11:31:30' #that's a magical timestamp

Czas sprzętu

Teraz ustawiony jest czas systemowy, ale możesz zsynchronizować go z zegarem sprzętowym:

Służy --showdo drukowania czasu sprzętowego:

hwclock --show

Możesz ustawić zegar sprzętowy na bieżący czas systemowy:

hwclock --systohc

Lub czas systemowy do zegara sprzętowego

hwclock --hctosys
chaos
źródło
2
Punkty bonusowe za zilustrowanie nieoczywistych sposobów ustawiania daty za pomocą przykładów oraz za wskazanie różnicy między „czasem systemowym” a „zegarem sprzętowym”. Bardzo pomocna odpowiedź!
Mark Edington,
3

Zmień datę za pomocą datepolecenia. Jednak polecenie oczekuje pełnej daty jako argumentu:

# date -s "20141022 09:45"
Wed Oct 22 09:45:00 BST 2014

Aby zmienić część daty, wyślij bieżącą datę z częścią daty, którą chcesz zmienić jako ciąg, a wszystkie inne jako zmienne formatujące datę. Następnie przekaż to date -spolecenie, aby ustawić:

# date -s "$(date +'%Y12%d %H:%M')"
Mon Dec 22 10:55:03 GMT 2014

zmienia miesiąc na 12. miesiąc - grudzień.

Formaty dat to:

  • %Y - Rok
  • %m - miesiąc
  • %d - dzień
  • %H - Godzina
  • %M - Minuta
garethTheRed
źródło
Próbuję zmienić, ale to się nie zmienia: - $ sudo date --set = "2015-09-30 10: 05: 59.990" Śr 30 września 10:05:59 +0530 2015 $ data czw maj 23 15:10:37 +0530 2019
Vinod
2

Dla takich jak ja z ESXI 5.1, system odpowiedział mi

~ # date -s "2016-03-23 09:56:00"
date: invalid date '2016-03-23 09:56:00'

Zamiast tego musiałem użyć określonej komendy ESX:

esxcli system time set  -y 2016 -M 03 -d 23  -H 10 -m 05 -s 00
Balmipour
źródło
3
Dzięki za -1, ale czy mógłbyś wyjaśnić dlaczego ? Jeśli masz lepszą / bardziej kompletną / dokładniejszą odpowiedź, możesz komentować.
Balmipour,
1

Polecenie zmiany daty systemowej to date.

Istnieją dwa sposoby wywołania polecenia date (w systemie Linux):

   date [OPTION]... [+FORMAT]
   date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

Łatwo

Najprostszym sposobem jest użycie, date -sponieważ pozwala na użycie prostych dat względnych

 $ date -s yesterday; date
 date: cannot set date: Operation not permitted
 Sat Jan  5 07:21:07 EST 2019
 Sun Jan  6 07:21:07 EST 2019

Data nie uległa zmianie, ponieważ została wykonana z ograniczonym użytkownikiem $. Jeśli naprawdę chcesz zmienić datę, użyj root ( #) lub sudo:

 $ sudo date -s yesterday; date
 Sat Jan  5 07:21:07 EST 2019
 Sat Jan  5 07:21:07 EST 2019

Tak więc zmiana dowolnej części względnej daty jest tak łatwa, jak jej nadanie:

 $ date -s "5 years ago"
 Mon Jan  6 08:26:26 EST 2014

 $ date -s "+6 months"
 Sat Jul  6 08:28:39 EDT 2019

 $ date -s "+3 hours -13 minutes"
 Sun Jan  6 11:16:59 AST 2019

Bezwzględne daty są nieco bardziej złożone, ponieważ wymagają więcej szczegółów:

 $ date -s "2001-07-23 10:11:12"

Możesz też użyć polecenia date dwa razy:

 $ date -s "$(date +'%Y-%m-%d %H:%M:%S')"

zastąp dowolną z %poprawną wartością, a data zostanie ustawiona (tylko jako root).

 $ date -s "$(date +'%Y-11-%d %H:%M:%S')"
 Wed Nov  6 08:37:15 EST 2019

bezpośredni

Formularz połączenia z drugą datą służy do bezpośredniej zmiany daty systemowej.

 date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

Więc :

 date 11230812              # MMDDhhmm

Ustawi datę na 23 listopada na 08h i 12min.

BSD ma podobne polecenie, ale inny format ([[[[[[cc] yy] mm] dd] HH] MM [.ss]).

Spróbuj datejako ograniczony użytkownik, aby zobaczyć, co by zrobił (bez zmiany czegokolwiek):

 $ date 11230812
 date: cannot set date: Operation not permitted
 Sat Nov 23 08:12:00 EST 2019

Lub, jeśli naprawdę chcesz zmienić datę, jako root:

 # date 11230812
 # date
 Sat Nov 23 08:12:00 EST 2019

Pamiętaj, że wpłynie to na usługi takie jak NTP lub chrony. A jeśli zrestartowany zresetuje datę z powrotem do prawdziwej.

Dodaj rok, aby ustawić rok:

 $ date 1123081222
 date: cannot set date: Operation not permitted
 Wed Nov 23 08:12:00 EST 2022

Lub CCYY, aby ustawić rok i wiek:

 $ date 112308121982
 date: cannot set date: Operation not permitted
 Tue Nov 23 08:12:00 EST 1982
Izaak
źródło
-1

Użyłem polecenia daty i formatu czasu wymienionych poniżej, aby pomyślnie ustawić datę z polecenia powłoki terminalu wykonanego na Android Things, który używa jądra Linux.

data 092615002017.00

MMDDHHMMRRRR.SS

MM - miesiąc - 09

DD - Dzień - 26

GG - godzina - 15

MM - Min. 00

RRRR - rok - 2017

.SS - drugi - 00

Brook Oldre
źródło
Ponieważ nie działa to ani z GNU, ani z BSD date, czy mógłbyś dodać więcej informacji o tym, dla którego systemu jest to istotne i jak to ma związek z tym konkretnym pytaniem.
Kusalananda