Potrzebuję przekonwertować niektóre pola TIMESTAMP na INT w naszym DB MySQL (InnoDB). Zdaję sobie sprawę, że konwersja TIMESTAMP na INT jest niezwykła, ale wciąż musimy to zrobić :)Konwersja TIMESTAMP na INTEGER Mysql - timezones
Wydaje się dość proste, ale są pewne błędy związane ze strefą czasową i czasem letnim.
Mam skrypt, który generuje mój kod SQL na kolumnę. Na przykład, generuje:
ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED;
UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started);
ALTER TABLE alarmLog DROP started;
alter TABLE alarmLog CHANGE started_tmp started INT UNSIGNED NULL DEFAULT 0;
Jeśli porównać przed i po danych z wykorzystaniem select FROM_UNIXTIME(1291788036);
, wynik wygląda dobrze.
Chodzi o to, aby zmienić całe oprogramowanie po stronie klienta, aby przekonwertować na UTC i użyć tej INT podczas zapisywania. Podczas pobierania ta INT jest konwertowana na bieżącą strefę czasową.
ale potem docs warn me o tym scenariuszu (letniego w CET):
mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2005-03-27 02:00:00') |
+---------------------------------------+
| 1111885200 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2005-03-27 03:00:00') |
+---------------------------------------+
| 1111885200 |
+---------------------------------------+
1 row in set (0.00 sec)
Jak API i systemów operacyjnych zwykle zajmują się letni? Wiem, że mój komputer ma swój zegar w UTC, a latem system operacyjny dodaje dwie godziny, a zimą jeden. Zakładam, że używa czasu UTC do ustalenia, czy jest to czas letni, czy nie.
Jak sobie z tym poradzić? Czy jedynym rozwiązaniem jest dodanie pola do bazy danych w celu określenia przesunięcia czasu letniego?
Czas letni to inna strefa czasowa. Na przykład. CET to czas środkowoeuropejski, CEST to środkowoeuropejski czas letni. Twój system operacyjny wie kiedy się przełączyć. Dopóki używasz UTC do sygnatur czasowych, to do warstwy prezentacji należy przekonwertować ją na czas lokalny. –