Zmiana daty i czasu w Linux

Aby zmienić date musisz być zalogowany jako root lub jako użytkownik uprzywilejowany (w niektórych dystrybucjach przed komeną wpisujemy sudo i podajemy hasło użytkownika uprzywilejowanego utworzonego podczas instalacji systemu)

Czas w formacie CEST (wschodnioeuropejska strefa czasowa uwzględniony jest czas letni/zimowy)

user@pc~$ date
sob, 15 gru 2012, 12:28:52 CET

Czas w formacie UTF (Uniwersalny Czas Koordynowany – minus 2 godziny ze względu na czas letni dla Polski)

user@pc~$ date -u
sob, 15 gru 2012, 11:36:29 UTC

Czas w formacie RFC-2822 (czas lokalny w formacie do jakiego jesteśmy przyzwyczajeni. Zapis „+0200” określa przesunięcie czasowe względem UTC)

user@pc~$ date -R
Sat, 15 Dec 2012 12:39:36 +0100

Pełny format polecenia zmieniającego czas systemowy jest następujący:
user@pc~$ date MMDDhhmmCCYY.ss

MM – miesiąc (np. styczeń 01)
DD – dzień miesiąca (np. 15)
hh – godzina (np. 10)
mm – minuta (np. 40)
CC – pierwsze dwie cyfry roku (system przyjmuje domyślnie te z aktualniej daty; tutaj 19)
YY – dwie ostatnie cyfry roku (system przyjmuje domyślnie te z aktualniej daty; tutaj 12)
ss – sekundy (system przyjmuje domyślnie 00)

Zmieńmy czas systemowy na 15 grudnia 2012 godzina 12:28 i 52 sekundy:
user@pc~$ date
sob, 14 gru 2012, 12:10:02 CET

root@pc~# date 121512282012.52
sob Gru 15 12:28:52 CET 2012

Odczytujemy i ustawiamy zegar sprzętowy RTC (hwclock) jako root:
root@pc~# hwclock
sob, 15 gru 2012, 11:44:57 -0.986103 sekund

Zmieńmy teraz nieco czas systemowy, a następnie zsynchronizujmy do niego zegar sprzętowy:
user@pc~$ date
sob, 15 gru 2012, 12:28:52 CET

root@pc~# date 04181330 sob Gru 15 13:30:00 CEST 2012
systohc – System Time To Hardware Clock
root@pc~# hwclock --systohc
root@pc~# hwclock sob Gru 15 13:30:31 2012 -0.419225 seconds

Zmieniliśmy czas systemowy i zapewniliśmy sobie przez równoczesną modyfikację nastaw zegara sprzętowego trwałość zmiany czasu systemowego. Efekt otrzymamy dopiero po zrestartowaniu komputera.

Praktyczną sytuacją jest konieczność trwałej korekty czasu o godzinę czy kilkanaście minut:
root@pc~# date MMDDhhmm
root@pc~# hwclock --systohc

Konfigurujemy parametry czasu (timeconfig) Pozostały jeszcze dwa parametry czasu, nad którymi nie potrafimy sprawować kontroli. Mianowicie nie potrafimy zmienić strefy czasowej, ani określić, czy zegar sprzętowy odmierza czas UTC, czy też lokalny. Otóż zegar sprzętowy odmierza jedynie czas od zadanego momentu początkowego i nie zawiera żadnych wskaźników dotyczących, czy jest to czas lokalny, czy UTC (ani tym bardziej jaka to strefa czasowa itp.). To, jaki czas zawiera nasz zegar sprzętowy jest kwestią konwencji którą sami przyjmiemy. Informacje o tej konwencji przechowuje plik /etc/sysconfig/clock. Natomiast informację na temat strefy czasowej plik /etc/localtime. Obejrzymy pierwszy z nich:

  1. cat /etc/sysconfig/clock

UTC=false ARC=false [root@crash /root]# _
Plik zawiera dwa parametry: UTC i ARC. Przyjmowane przez nie wartości oznaczają: UTC=true – zegar sprzętowy zawiera czas UTC (GMT) UTC=false – zegar sprzętowy zawiera czas lokalny ARC=true – sprzętowy format czasu dla platformy Alpha ARC=false – sprzętowy format czasu dla platformy Intel (nasza)
Plik /etc/localtime jest dowiązaniem symbolicznym do pliku Warsaw wskazującego „nasze miejsce na Ziemi”. Plik Warsaw nie jest zwykłym plikiem tekstowym. Zawiera on dane dotyczące nie tylko geograficznej strefy czasowej, ale także reguł zmiany czasu z letniego na zimowy (i odwrotnie) w naszym kraju. Do modyfikacji plików /etc/localtime i /etc/sysconfig/clock służy narzędzie timeconfig. Wywołując:

  1. timeconfig

otrzymujemy semigraficzne menu, w którym możemy ustawić konwencję UTC (GMT) dla zegara sprzętowego (gwiazdka w polu [*] Hardware clock set to GMT) oraz wybrać miejsce na Ziemi (strefę czasową). Skrypt setclock W katalogu /usr/sbin znajdować się powinien skrypt setclock synchronizujący zegar sprzętowy do czasu systemowego z uwzględnieniem zawartości pliku /etc/sysconfig/clock.

  1. setclock
  2. date

Thu Apr 22 22:25:47 CEST 1999 [root@crash /root]# hwclock Thu Apr 22 22:25:47 1999 -0.216723 seconds [root@crash /root]# _
Skrypt setclock poprzez uwzględnienie ustawienia parametru „UTC=true/false” jest zatem bardzo wygodnym narzzędziem do synchronizacji zegara sprzętowego. Należy ujawnić, że istnieje opcja –utc polecenia hwclock, wskazująca, ze przyjmujemy konwencję, iż zegar sprzętowy zawiera czas UTC. Zlecenia jednorazowe (at) Wykorzystajmy teraz pełny format i zmieńmy czas systemowy na 14 marca 1999 godzina 11:05 i 17 sekund, a następnie powróćmy korzystając ze skróconego formatu do czasu aktualnego:

  1. date

Sun Apr 18 11:42:40 CEST 1999 [root@crash /root]# date 031411051999.17 Sun Mar 14 11:05:17 CET 1999 [root@crash /root]# date 04181143 Sun Apr 18 11:43:00 CEST 1999 [root@crash /root]# _
Odczytujemy i ustawiamy zegar sprzętowy RTC (hwclock) Jak łatwo się domyślić odczyt zegara sprzętowego przeprowadza się następująco:

  1. hwclock

Sun Apr 18 12:49:49 1999 -0.54325 seconds [root@crash /root]# _
Zmieńmy teraz nieco czas systemowy, a następnie zsynchronizujmy do niego zegar sprzętowy:

  1. date

Sun Apr 18 12:52:24 CEST 1999 [root@crash /root]# date 04181330 Sun Apr 18 13:30:00 CEST 1999 [root@crash /root]# hwclock –systohc [root@crash /root]# hwclock Sun Apr 18 13:30:31 1999 -0.419225 seconds [root@crash /root]# _
Zmieniliśmy czas systemowy, ale jednocześnie zapewniliśmy sobie przez równoczesną modyfikację nastaw zegara sprzętowego trwałość zmiany czasu systemowego. Zapamiętajmy dobrze opcję –systohc (system time to hardware clock). Jest ona niezwykle skuteczna. Spróbujmy teraz niezależnie zmienić czas zegara sprzętowego i zobaczyć jakie będą tego konsekwencje. Datę pozostawiamy bez zmian, zmienimy tylko godzinę i minutę: [root@crash /root]# hwclock Sun Apr 18 13:45:58 1999 -0.583225 seconds [root@crash /root]# hwclock –set -date”04/18/99 14:15:00″ [root@crash /root]# hwclock Sun Apr 18 14:15:06 1999 -0.090563 seconds [root@crash /root]# date Sun Apr 18 13:47:29 CEST 1999 [root@crash /root]# _
Zauważamy, że zmiana czasu zegara sprzętowego nie zrobiła żadnego wrażenia na czasie systemowym. Nie ma w tym nic dziwnego, gdyż oba zegary kontaktują się ze sobą tylko w momencie startu systemu. Zrestartujmy teraz komputer. [root@crash /root]# date Sun Apr 18 14:31:56 CEST 1999 [root@crash /root]# hwclock Sun Apr 18 14:32:06 1999 -0.090563 seconds [root@crash /root]# _
Jak widzimy, czas systemowy został zsynchronizowany do zegara sprzętowego. Ten sam efekt możemy uzyskać w bardziej elegancki sposób, korzystając z opcji –hctosys (hardware clock to system time) polecenia hwclock: [root@crash /root]# hwclock Sun Apr 18 15:22:01 1999 -0.390563 seconds [root@crash /root]# hwclock –set -date”04/18/99 17:50:00″ [root@crash /root]# hwclock Sun Apr 18 17:50:11 1999 -0.820563 seconds [root@crash /root]# date Sun Apr 18 15:23:56 CEST 1999 [root@crash /root]# hwclock –hctosys [root@crash /root]# date Sun Apr 18 17:50:43 CEST 1999 [root@crash /root]# _
Najczęściej spotykaną w praktyce sytuacją jest konieczność trwałej korekty czasu o godzinę czy kilkanaście minut. Najłatwiejsza do zapamiętania sekwencja służąca do tego, to:

  1. date MMDDhhmm
  2. hwclock –systohc

Konfigurujemy parametry czasu (timeconfig) Pozostały jeszcze dwa parametry czasu, nad którymi nie potrafimy sprawować kontroli. Mianowicie nie potrafimy zmienić strefy czasowej, ani określić, czy zegar sprzętowy odmierza czas UTC, czy też lokalny. Otóż zegar sprzętowy odmierza jedynie czas od zadanego momentu początkowego i nie zawiera żadnych wskaźników dotyczących, czy jest to czas lokalny, czy UTC (ani tym bardziej jaka to strefa czasowa itp.). To, jaki czas zawiera nasz zegar sprzętowy jest kwestią konwencji którą sami przyjmiemy. Informacje o tej konwencji przechowuje plik /etc/sysconfig/clock. Natomiast informację na temat strefy czasowej plik /etc/localtime. Obejrzymy pierwszy z nich:

  1. cat /etc/sysconfig/clock

UTC=false ARC=false [root@crash /root]# _
Plik zawiera dwa parametry: UTC i ARC. Przyjmowane przez nie wartości oznaczają: UTC=true – zegar sprzętowy zawiera czas UTC (GMT) UTC=false – zegar sprzętowy zawiera czas lokalny ARC=true – sprzętowy format czasu dla platformy Alpha ARC=false – sprzętowy format czasu dla platformy Intel (nasza)
Plik /etc/localtime jest dowiązaniem symbolicznym do pliku Warsaw wskazującego „nasze miejsce na Ziemi”. Plik Warsaw nie jest zwykłym plikiem tekstowym. Zawiera on dane dotyczące nie tylko geograficznej strefy czasowej, ale także reguł zmiany czasu z letniego na zimowy (i odwrotnie) w naszym kraju. Do modyfikacji plików /etc/localtime i /etc/sysconfig/clock służy narzędzie timeconfig. Wywołując:

  1. timeconfig

otrzymujemy semigraficzne menu, w którym możemy ustawić konwencję UTC (GMT) dla zegara sprzętowego (gwiazdka w polu [*] Hardware clock set to GMT) oraz wybrać miejsce na Ziemi (strefę czasową). Skrypt setclock W katalogu /usr/sbin znajdować się powinien skrypt setclock synchronizujący zegar sprzętowy do czasu systemowego z uwzględnieniem zawartości pliku /etc/sysconfig/clock.

  1. setclock
  2. date

Thu Apr 22 22:25:47 CEST 1999

[root@crash /root]# hwclock
Thu Apr 22 22:25:47 1999 -0.216723 seconds