Nástroje používateľa

Nástoje správy stránok


dev:omega:events

Toto je staršia verzia dokumentu!


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 UTC 1) unixový čas 2). Dalo by sa aj povedať, že sú uložené v časovom pásme +0000.

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.

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_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_date_start`,
			"+00:00",
			@@session.time_zone
		)
	) - (`event_tzo` * 60);
1) Koordinovaný svetový čas alebo Coordinated Universal Time
2) Počet sekúnd od 1.1.1970
3) /local_settings/app.settings.php
4) 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.
dev/omega/events.1444740959.txt.gz · Posledná úprava: 2015/10/13 14:55 od Roman Sališ