Termíny v SystemOmega sú ukladané v tabuľke `st2_events`
.
Začiatok a koniec termínu je uložený ako UTC 1) unixový čas 2). Dalo by sa aj povedať, že sú uložené v časovom pásme +0000
. Je to prevencia proti problémom spojených so striedaním zimného a letného času.
Každá technológia, v ktorej sú umiestené termíny, má nastavené časové pásmo (v minútach), v ktorom sa nachádza. Napríklad technológie umiestnené v Bratislave majú časové pásmo +0100
, teda v databáze je uložené +60
minút.
Pre získanie času termínu je potrebné používať funkcie pre prácu s UTC alebo GM časom. Napríklad v PHP namiesto funkcie date()
použijeme gmdate()
, vo Flash namiesto Date().getHours()
použijeme Date().getUTCHours()
.
V hlavnej konfigurácií SystemOmega 3) sa nachádza položka Default local TZO
, kde sa definuje časová zóna servera v minútach. Týmto nastavením určujeme, ako sa budú prepočítavať lokálny čas, napr. ako vznikne pole `event_local_date_start`
.
Je jedno, či je letný alebo zimný čas, SystemOmega klient pri ukladaní rozoznáva aktuálne časové pásmo užívateľa4) a vypočíta, aby bol tento termín uložený správne bez ohľadu na aktuálny letný alebo zimný čas.
Niektoré polia súvisiace s časom:
Pole | Typ | Význam |
---|---|---|
`event_tzo` | int | Časové pásmo v minútach, získané z technológie |
`event_date_start` | unsigned int | Začiatok termínu ako UTC |
`event_date_end` | unsigned int | Koniec termínu ako UTC |
`event_local_date_start` | datetime | Začiatok termínu v lokálnom čase servera |
`event_local_date_end` | datetime | Koniec termínu v lokálnom čase servera |
Nachádzame sa v meste Bratislava, ktoré je v časovom pásme +0100
. Dokonca v letnom čase hovoríme o posune +0200
, ale našťastie to nebude problém.
Termín, ktorý ideme zapísať, sa začína 29.10.2014 o 08:00
.
Tento čas sa následne prepočíta podľa nastavenia časovej zóny klienta a výsledkom bude UTC čas, ktorý sa do databázy uloží ako hodnota
.
`event_date_start`
=1414566000
echo gmdate("r (e)", 1414566000); // Wed, 29 Oct 2014 07:00:00 +0000 (UTC)
Ako je vidieť z výstupu, termín je naozaj uložený správne ako UTC čas. Ak by sme ho chceli v PHP správne zobraziť, musíme vedieť časové pásmo technológie, v ktorej je uložený (pole `event_tzo`
).
echo gmdate("r (e)", 1414566000 + (60 * 60)); // Wed, 29 Oct 2014 08:00:00 +0000 (UTC)
Potrebujeme časový posun v sekundách, takže 60 * 60
znamená 60 minút podľa TZO technológie (`event_tzo`
) krát 60 sekúnd, keďže potrebujeme posun v sekundách.
Keby sme nepoužili UTC/GM funkcie, výsledok by bol odlišný a vôbec nie správny:
echo date("r (e)", 1414566000 + (60 * 60)); // Wed, 29 Oct 2014 09:00:00 +0100 (Europe/Bratislava)
SET `event_local_date_start` := CONVERT_TZ( FROM_UNIXTIME(`event_date_start` + (`event_tzo` * 60)), @@session.time_zone, "+00:00" );
SET `event_date_start` := UNIX_TIMESTAMP( CONVERT_TZ( DATE_SUB(`event_local_date_start`, INTERVAL `event_tzo` MINUTE), "+00:00", @@session.time_zone ) );
Druhá metóda, snáď rýchlejšia:
SET `event_date_start` := UNIX_TIMESTAMP( CONVERT_TZ( `event_local_date_start`, "+00:00", @@session.time_zone ) ) - (`event_tzo` * 60);