Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Pavel
Tvůrce
Avatar
Pavel:30.6.2016 22:05

Ahoj,

při převodu staršího uložení v DB ve formátu UNIXTime na nový DateTime jsem zjistil jistou nesrovnalost s převodem do nového formátu, tak bych se o něj s vámi podělil.

Při vytváření instance data pomocí new DateTime() se vždy vychází z časové zóny UTC ('Europe/London'), i když při vytváření instance použijete DateTimeZone("E­urope/Prague").

$datum = new DateTime("@$datumUnix", new DateTimeZone('Europe/Prague')); // nefunguje

Pokud budete chtít změnit časouvou zónu, musíte použít příkaz:

$datum = new DateTime("@$datumUnix");
$datum->setTimeZone(new DateTimeZone("Europe/Prague")); //spravne

Snad vám tato informace ušetři spoustu času než mě :-)4

Pavel

P.S. Možná by nebylo špatné se o tom zmínit v seriálu OOP v sekci DateTime, kde jsem to také hledal, ale tato informace tam není ( IT Network OOP - Datum a čas )

 
Odpovědět
30.6.2016 22:05
Avatar
shaman
Člen
Avatar
Odpovídá na Pavel
shaman:1.7.2016 13:56

Nie je to celkom pravda ze to nefunguje. V dokumentacii php pre DateTime http://php.net/…onstruct.php je poznamka:

Note:
The $timezone parameter and the current timezone are ignored when the $time parameter either is a UNIX timestamp (e.g. @946684800) or specifies a timezone (e.g. 2010-01-28T15:00:00+02:00).

Co vlastne znamena ze timezone bude ignorovane ked time parameter obsahuje informaciu o timezone alebo sa jedna o UNIX timestamp. Unix timestamp sa pocita v UTC. V tvojom pripade si prevadzal UNIX timestamp, ktory uz obsahuje informaciu o timezone a teda sa spravne ignoroval tvoj timezone paramater.

Nakoniec si to ale vyriesil spravne. :)

Nahoru Odpovědět
1.7.2016 13:56
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Pavel
Tvůrce
Avatar
Odpovídá na shaman
Pavel:1.7.2016 15:27

Ahoj,

no.. když ho ignoruje, to znamená, že tím pádem si nemůžeš nastavit při vytváření jinou časovou zónu než je UTC ('Europe/London'), což jsem napsal.

A pokud chce člověk jinou časovou zónu, napsal jsem postup. Nevidím nesrovnalost, ale potvrzení z dokumentace ;-)

Ale díky za upřesnění ...

Pavel

 
Nahoru Odpovědět
1.7.2016 15:27
Avatar
mkub
Tvůrce
Avatar
mkub:1.7.2016 16:18

ohladne Unix timestamp si vedla, pocita sa od zaciatku Unix ery a je to pocet ubehnutych sekund od 1. 1. 1970 UTC

 
Nahoru Odpovědět
1.7.2016 16:18
Avatar
shaman
Člen
Avatar
Odpovídá na Pavel
shaman:1.7.2016 17:15

Ako mkub spomenul, UNIX timestamp su sekundy od zaciatku roku 1970 a to v UTC timezone. Tym padom UNIX timestamp uz ma nastavenu timezonu (UTC) a preto pri vytvarani objektu DateTime sa neprihliada na druhy argument, pretoze ten prvy argument uz obsahuje informaciu o timestampe.Takze ty ked nastavujes v druhom riadku timezonu, tak ten cas nemenis, len ho prepocitas z UTC do ineho (v tvojom pripade "Europe/Prague")

Nahoru Odpovědět
1.7.2016 17:15
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Pavel
Tvůrce
Avatar
Pavel:1.7.2016 19:23

pane Bože,

vím co je UNIXTime čas :-@ ...

Já tu chcel jen napsat, že nelze nastavit při vytváření času v tomto formatu DateTimeZone přímo jako u ostatních a aby si na to ostatní dali pozor, jelikož mě to vypeklo a dlouho mě to trvalo, než sem přišel na to proč. Ne tu diskutovat o nesmyslech..

Pavel

 
Nahoru Odpovědět
1.7.2016 19:23
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.