1:59:60 – taką godzinę zobaczymy już niedługo (sekunda przestępna)

2012-07-01 01:59:60 – 1 lipca o godzinie 2 w nocy będzie miało miejsce dodanie jednej sekundy do obecnego czasu, w celu wyrównania czasu ze średnim czasem słonecznym. Jest to tak zwana sekunda przestępna.

Sekunda przestępna

Cytując Wikipedię:

Sekunda przestępna, nazywana też sekundą skokową – dodatkowa sekunda dodawana czasem (zwykle w czerwcu lub w grudniu) w celu zsynchronizowania uniwersalnego czasu koordynowanego ze średnim czasem słonecznym. Daty dodawania sekund przestępnych w celu zsynchronizowania doby z opóźniającym się ruchem obrotowym Ziemi na podstawie obserwacji astronomicznych określa Międzynarodowa Służba Ruchu Obrotowego Ziemi i Systemów Odniesienia (ang. International Earth Rotation and Reference Systems Service, w skr. IERS).

No i IERS określiło datę dodania takiej sekundy: 30 czerwiec 2012 23:29:59 uniwersalnego czasu koordynowanego (UTC).

Dodawanie (lub odejmowanie) sekundy do obecnego czasu jest związane z kilkoma czynnikami. Po pierwsze w latach 50 ubiegłego stulecia długość doby słonecznej została wyznaczona zbyt mało dokładnie. Inny czynnik to zmienna prędkość obrotowa ziemi, od której zależy długość doby słonecznej. Obecnie różnica pomiędzy uniwersalnym czasem koordynowanym (z którego my korzystamy po przesunięciu o strefę czasową) a czasem astronomicznym zmienia się o 2-3 milisekundy dziennie.

Poniższy wykres pokazuje różnicę pomiędzy UTC i czasem astronomicznym. Skoki na wykresie wynikają z korekt wprowadzonych do UTC (właśnie tzw. sekund przestępnych):

Aby dokładniej to zobrazować, na poniższym wykresie zieloną linią oznaczona jest średnia roczna różnica pomiędzy omawianymi czasami, a czerwoną różnica w czasie jaka z tego powodu powstała (kropkami oznaczone są daty, w których dodano sekundę przestępną):

Właśnie miejsca kropek z drugiego wykresu są skokami widocznymi na pierwszym wykresie. Dokładna lista dodanych sekund przestępnych znajduje się np. w Wikipedii.

Sekunda przestępna dodawana jest zawsze, o ile jest to konieczne, z początkiem nowego roku lub w kalendarzowej jego połowie i zawsze w tym samym momencie na całej kuli ziemskiej. Oznacza to, że u nas nastąpi o godzinie 1:59:59, ponieważ naszą strefą czasową jest UTC+01:00, a dodatkowo mamy teraz czas letni, co zwiększa czas o kolejną godzinę. nie ma określonych dat, kiedy taka sekunda będzie dodana – jak pisałem są one ustalane w zależności od np. prędkości obrotowej ziemi, która jest zmienna.

 

Dodanie sekundy przestępnej

W ramach dodania sekundy przestępnej, godzina będzie się zmieniać następująco:

2012-06-30 23:59:58
2012-06-30 23:59:59
2012-06-30 23:59:60   <- !!!
2012-07-01 00:00:00
2012-07-01 00:00:00

Dodana została jedna sekunda jako 60 sekunda w minucie. Na większości zegarków nie zobaczymy jednak takiej godziny, ponieważ standardowe zegarki nie są przystosowane do uwzględniania sekundy przestępnej, oraz z powodu braku okresowości takiej zmiany, nie mają źródła informacji o tym, kiedy taką sekundę dodać. W wyniku tego, zegarki takie będą się spieszyć o 1 sekundę. Istnieją jednak takie zegarki, które pokażą tą zmianę.

Dlaczego akurat 60 sekunda w minucie? Jeśli się zastanowimy, 60 sekund to pełna minuta:
2012-06-30 23:60:00
a 60 minut to pełna godzina:
2012-06-30 24:00:00
24 godziny to pełny dzień:
2012-06-31 24:00:00
nie ma 31 czerwca – tu już 1 lipiec:
2012-07-00 24:00:00
Czyli jest to dokładnie ta sama godzina, która następuje po godzinie z 60 sekundami. W ten sposób bez zmiany godziny dodajemy jedną sekundę – jest to szczególnie ważne w systemach komputerowych (o czym niżej).

U nas (w Polsce) będzie to wyglądać następująco:

2012-07-01 01:59:58
2012-07-01 01:59:59
2012-07-01 01:59:60 <- !!!
2012-07-01 02:00:00
2012-07-01 02:00:01

 

Windows i Linux a sekunda przestępna

Co się stanie zatem w momencie dodania tej dodatkowej sekundy z popularnymi systemami operacyjnymi? Ja sprawdziłem jak się zachowają Linuksy/Uniksy i systemy z rodziny Windows.

Najpierw krótko o Unix time i NTP. Unix time to znacznik czasu liczony od północy 1 stycznia 1970 roku. Zawsze. Tak samo zawsze jedna doba zwiększa ten znacznik o 86400 sekund. Nie ważne, czy znajduje się tam sekunda przestępna, czy nie. NTP to protokół synchronizacji czasu z którego korzysta obecnie wiele systemów operacyjnych. NTP jest w stanie przekazać informację o sekundzie przestępnej, ale nie wszystkie systemy operacyjne z tego korzystają.

Aby dodać sekundę przestępną, a jednocześnie aby Unix timestamp nie zwiększył się o 1 sekundę za dużo (bo nie może), różne systemy wykonują rożne akcje. Możliwe jest:

  • cofniecie zegara o 1 sekundę po wystąpieniu sekundy przestępnej
  • zatrzymanie zegara na 1 sekundę w tracie trwania sekundy przestępnej
  • spowolnienie zegara przez czas trwania sekundy przestępnej i kolejnej tak, aby znacznik czasu zwiększył się tylko o 1 sekundę

Większość systemów Linux i Unix prawidłowo obsługuje sekundę przestępną i stosuje pierwszą z wymienionych metod. Wygląda to mniej więcej tak:

1341093599,00  <- 2012-06-30 23:59:59
1341093599,50
1341093600,00   <- 2012-06-30 23:59:60
1341093600,50
1341093600,00   <- 2012-07-01 00:00:00
1341093600,50   ^- ten sam znacznik czasu drugi raz
1341093601,00   <- 2012-07-01 00:00:01
1341093601,50

Jak widać, zegar jest cofany o 1 sekundę.

Jeśli system nie korzysta z NTP, czyli nie synchronizuje okresowo czasu przy użyciu tego protokołu, nadal może prawidłowo dodać sekundę, jeśli będzie posiadał informację o sekundach przestępnych. Zazwyczaj informacje takie zawarte są w paczce timezones, ale w rożnych systemach Unix/Linux możne to być inna paczka. Oczywiście system musi posiadać jej aktualną wersję. Jeśli system nie korzysta ani z NTP, ani nie ma aktualnych informacji o sekundach przestępnych, nie zmodyfikuje zegara i czas będzie się spieszył na nim o 1 sekundę.

Systemy z rodziny Windows ignorują informację o sekundach przestępnych. Oznacza to, że zegar systemowy w tym przypadku zawsze będzie się spieszył o jedną sekundę do czasu najbliższej synchronizacji zegara. Koniec. Kropka. W przypadku Windowsów nie ma tutaj nic więcej do omawiania :)

 

MySQL i PHP a sekunda przestępna

Sprawdziłem z ciekawości, jak zachowa się MySQL i PHP jeśli poda im się czas z sekundą przestępną:

MySQL w najnowszej wersji dostępnej na dotdeb.org, czyli 5.5.25:

mysql> select UNIX_TIMESTAMP('2012-06-30 23:59:59');
+---------------------------------------+
| UNIX_TIMESTAMP('2012-06-30 23:59:59') |
+---------------------------------------+
|                            1341093599 |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> select UNIX_TIMESTAMP('2012-06-30 23:59:60');
+---------------------------------------+
| UNIX_TIMESTAMP('2012-06-30 23:59:60') |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select UNIX_TIMESTAMP('2012-07-01 00:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2012-07-01 00:00:00') |
+---------------------------------------+
|                            1341093600 |
+---------------------------------------+
1 row in set (0.00 sec)

Jak widać, MySQL ma problem z godziną podaną w takim formacie (jeśli jakiś skrypt chciałby taką przekazać) – zgłasza ostrzeżenie.

PHP (również z dotdeb.org) w wersji 5.4.3:

root@dev-debian:/var/www# php -r "echo strtotime('2012-06-30 23:59:59').\"\\n\";"
1341100799
root@dev-debian:/var/www# php -r "echo strtotime('2012-06-30 23:59:60').\"\\n\";"
1341100800
root@dev-debian:/var/www# php -r "echo strtotime('2012-07-01 00:00:00').\"\\n\";"
1341100800
root@dev-debian:/var/www#

PHP radzi sobie właściwie z sekundą przestępną i podaje właściwy znacznik czasu – taki sam jak w przypadku godziny następującej po sekundzie przestępnej.

 

Podsumowanie

Większość z nas nawet nie zauważy zmiany czasu wynikającego z dodania sekundy przestępnej. Problemy mogą pojawić się za to w systemach informatycznych, które nie zawsze prawidłowo obsługują takie zmiany. Szukając informacji w Google znalazłem wiele zgłoszeń dotyczących całkowitego zawieszenia się Linuksów w momencie wystąpienia sekundy przestępnej, ale to były starsze zgłoszenia. Większość z nas w ogóle nie doświadczy problemów związanych z tą zmianą.

A może Wy wiecie jak taką zmianę obsługują inne systemy operacyjne, albo jak sobie radzą inne języki programowania czy usługi z godziną w sekundzie przestępnej?

 

Aktualizacja:
Zobacz także: Sekunda przestępna – jednak spowodowała trochę problemów

 

Źródła: Wikipedia, Wikipedia, Wikipedia, Wikipedia, Wikipedia, Wikipedia, Novell, Microsoft, Meinberg Funkuhren GmbH & Co. KG, LeapSecond.com, Derick Rethans, Time and Date, IERS

Ten wpis został opublikowany w kategorii Debian, Internet, Linux, Oprogramowanie, PHP, Programowanie, Serwery, WWW i oznaczony tagami , , , , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Musisz się zalogować (także Facebook, Google+, Twitter), aby móc dodać komentarz.