====== Práca s termínmi ====== Termíny v SystemOmega sú ukladané v tabuľke **``st2_events``**. Začiatok a koniec termínu je uložený ako [[wp>UTC]] ((Koordinovaný svetový čas alebo Coordinated Universal Time)) unixový čas ((Počet sekúnd od 1.1.1970)). 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 ((''/local_settings/app.settings.php'')) 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ľa((Je možné, že sa v budúcnosti v niektorých prehliadačoch vyskytne chyba, ktorá nesprávne vyhodnotí časové pásmo. V minulosti sa to stalo napr. v Chrome 22.)) a vypočíta, aby bol tento termín uložený správne bez ohľadu na aktuálny letný alebo zimný čas. ===== Polia v tabuľke `st2_events` ===== 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 | ===== Príklad ===== 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) ===== Funkcie pre prácu v časom ===== ==== PHP ==== ==== Flash ==== ==== MySQL ==== === Prevod na lokálny dátum === SET `event_local_date_start` := CONVERT_TZ( FROM_UNIXTIME(`event_date_start` + (`event_tzo` * 60)), @@session.time_zone, "+00:00" ); === Prevod z lokálneho dátumu === 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);