Nastavení časového pásma v php. Date timezone – Nastavení časového pásma v PHP a MySQL

Někdy nastane situace, že aktuální čas na serveru neodpovídá vašemu aktuálnímu časovému pásmu nebo časovému pásmu regionu, na který je váš web zacílen.

Aby to bylo jasné, dovolte mi připomenout: Rusko je geograficky velmi velké a ne každý potřebuje, aby jejich stránky „žily“ podle moskevského času. Například Ural, Sibiř, Dálný východ atd.

Nejoblíbenější servery Ruští poskytovatelé hostingu umístěné na technologických místech Moskvy a Petrohradu a standardně jsou samozřejmě nakonfigurovány pro moskevské časové pásmo. Server se nemůže automaticky přizpůsobit vaší aktuální poloze a upravit systémové hodiny. Fungování funkcí data a času na webu proto nemusí být zcela správné. Samozřejmě nyní nemluvíme o CMS, ve kterém je úprava časového pásma obvykle přítomna přímo v administrátorském rozhraní.

První kontrola Současný stav pomocí PHP kódu:

echo ini_get("date.timezone");

Je dobré, když máte svůj vlastní server a máte přístup k php.ini, kde si můžete nastavit požadované časové pásmo a zapomenout ho. Například tímto způsobem:

Date.timezone = Evropa/Moskva

Pokud však server hostí několik projektů, které musí podporovat různá časová pásma, je lepší to nedělat. V tomto případě by bylo správnější nastavit časová pásma pouze pro projekty se stejným časovým pásmem.

Nastavení časového pásma na sdíleném hostingu

Na sdíleném hostingu většinou není přístup ke konfiguracím serveru. Zkuste proto nejprve nastavit časové pásmo pomocí .htaccess. Stačí najít nebo vytvořit soubor .htaccess v kořenovém adresáři vašeho webu a přidat do něj následující řádek:

Php_value date.timezone "Evropa/Moskva"

Pokud metoda nefunguje, pak použijeme funkci date_default_timezone_set(), která nastaví výchozí časové pásmo pro všechny funkce data a času. Chcete-li to provést, stačí přidat následující řádek někam na začátek skriptu:

Date_default_timezone_set("Evropa/Moskva");

Přirozeně, Evropa/Moskva změní požadované časové pásmo. Pro území Ruské federace PHP podporuje následující časová pásma:

  • Evropa/Moskva
  • Evropa/Samara
  • Evropa/Kaliningrad
  • Evropa/Volgograd
  • Asie/Anadyr
  • Asie/Kamčatka
  • Asie/Krasnojarsk
  • Asie/Magadan
  • Asie/Novokuzněck
  • Asie/Novosibirsk
  • Asie/Omsk
  • Asie/Sachalin
  • Asie/Vladivostok
  • Asie/Jakutsk
  • Asie/Jekatěrinburg

Seznam všech dostupných časových pásem můžete zobrazit kliknutím na odkaz nebo spuštěním příkazu, který vám vrátí seznam časových pásem dostupných na vašem serveru.

Print_r(DateTimeZone::listIdentifiers());


Toto je krátký článek o tom, jak pracovat s časovými pásmy při ukládání hodnot data/času do databáze. Databáze nebo programovací jazyk, který se rozhodnete použít, není kritický, protože jevy popsané v článku jsou univerzální. Své počínání ukážu na příkladu použití kombinace MySQL a PHP. Problém spojený s časovými pásmy je docela triviální. Mnoho lidí na svou existenci často zapomíná a někteří je považují za něco příliš složitého. Když nastavujete databázi nebo používáte webhostingovou službu, vaše časová pásma jsou obvykle nakonfigurována ve výchozím nastavení. Výchozí nastavení je v pořádku, pokud provozujete jeden server, ale co se stane, když se rozhodnete jej přesunout?

Stejná otázka je logická, pokud máte několik serverů na různých místech.
Místo ukládání časových pásem ke každému datu je lepší vycházet ze standardního času a přiřadit k němu všechna data. Tato metoda umožňuje změnit na standardní čas před uložením hodnoty do databáze. Vůbec, dobrý nápad- snadné použití UTC +00:00.

Co je UTC

UTC je zkratka pro Coordinated Universal Time a je nástupcem Greenwichského středního času (GMT). Tyto dva formáty jsou téměř totožné, ale UTC je považován za uznávaný standard. Obecně platí, že UTC je založeno na 40 různých časových pásmech. Je obvyklé brát 00:00 hodin jako výchozí bod v UTC. Celkem existuje 12 hlavních časových pásem, s kladnými i zápornými hodnotami, a také některá další časová pásma, například půlhodinová. UTC +04:30. Myšlenka je, že pokud máte časové pásmo UTC -05:00, pak budete muset od počáteční hodnoty odečíst 5 hodin UTC +00:00 k dosažení požadovaného přizpůsobení. Tedy pokud je 14:00 (nebo 14:00) a vaše časové pásmo UTC-05:00(EST nebo východní časové pásmo). UTC +00:00 se bude rovnat 19:00 (nebo 19:00).
  • Grafické znázornění světových časových pásem (Wikipedie)
  • Seznam zkratek časových pásem (Wikipedia)

Ukládání času ve formátu UTC +00:00

První věc, kterou musíme udělat, je rozhodnout, které časové pásmo použijeme k uložení všech našich hodnot. Vřele doporučuji používat UTC +00:00- z žádného zvláštního důvodu kromě toho, že je snadno zapamatovatelný a 0 představuje ideální referenční bod. Protože víme, že všechna data jsou v UTC +00:00, je mnohem snazší reprezentovat správný čas pro každého uživatele na základě jeho osobních časových pásem. Jakmile si uživatel vybere (nebo my autodetekujeme) své časové pásmo, stává se zobrazení vhodného času pro daného uživatele samozřejmostí.

Nastavení výchozího časového pásma

Za předpokladu, že všechna naše data/časy jsou uloženy v UTC, můžeme jednoduše nastavit výchozí časové pásmo, které se použije k zobrazení pokaždé. Tím se automaticky vybere datum a čas pro konkrétního uživatele. V PHP vše, co musíme udělat, je nastavit časové pásmo takto:
date_default_timezone_set("EST");
Můžeme to udělat v nějakém inicializačním bloku na začátku našeho kódu a máme hotovo: všechna data se zobrazí podle časového pásma, ve kterém se uživatel nachází.

Pokud chceme plnou kontrolu nad datem a časem, můžeme funkci sestavit takto:
function get_date($date) ( date_default_timezone_set("EST"); $date = date("Y-m-d H:i:s", strtotime($date)); date_default_timezone_set("UTC"); return $date; )

Nastavení PHP pro UTC +00:00

Věci by samozřejmě nebyly tak jednoduché, kdybychom náš systém nenakonfigurovali tak, aby jako výchozí časové pásmo používal UTC. Jsem si jistý, že to lze udělat v podstatě stejným způsobem v jiných jazycích, ale PHP to dělá takto:
datum.časové pásmo = UTC
Nyní, kdykoli používáme věci, jako je funkce čas(), to nám automaticky dává čas UTC s příslušným posunem na základě času našeho serveru. Pokud chceme nastavit data v databázi, jako je MySQL, uděláme toto:
datum("Y-m-d H:i:s", čas());
Pokud jsme neměli přístup ke změně konfigurace PHP, musíme čas nastavit ručně při nastavování data, takto:
datum("Y-m-d H:i:s", cas() - datum("Z"));

Nastavení MySQL pro UTC +00:00

Přímé nastavení data, jak jsme to udělali výše, je použitelné, pokud nemáme přístup ke změně konfiguračních parametrů MySQL. Pokud však chceme použít ČASOVÉ RAZÍTKO, který se obvykle sám aktualizuje, nebo jako funkce data MySQL NYNÍ() pak musíme nakonfigurovat MySQL tak, aby používal UTC jako výchozí časové pásmo.

V MySQL se to dělá nastavením offsetu UTC, což lze provést stejně snadno jako v PHP provedením následujících změn:
default-time-zone = "+00:00"

Aktualizace stávajících dat/časů

Pokud se rozhodnete standardizovat časová pásma pomocí UTC, kde je výchozí časové pásmo UTC +00:00 offset, pak bude váš aktuální čas ve vaší databázi přerušen.

Naštěstí MySQL poskytuje šikovnou funkci, která nám umožňuje snadno aktualizovat stávající časová pásma.

POZNÁMKA: Pokud máte nějaká časová razítka, je třeba je nejprve aktualizovat.

Můžeme prohledat všechna pole data a času v naší databázi pomocí následujícího dotazu:
SELECT * FROM `informační_schéma`.`COLUMNS` WHERE `TABLE_SCHEMA`="název_tabulky" AND (`DATA_TYPE`="časové razítko" OR `DATA_TYPE`="datetime" OR `DATA_TYPE`="datum");
Odtud můžeme použít následující dotaz k aktualizaci dat/časů v našich tabulkách:
UPDATE `název_tabulky` SET `časové razítko`=CONVERT_TZ(`časové razítko`, "-05:00", "+00:00");
Kde -05:00 - aktuální časové pásmo ve formátu, ve kterém je uložen čas (stejně jako v předchozím případě se vztahuje k východnímu). Časové pásmo +00:00 , na který chceme převést, v tomto případě odkazuje na UTC.

21. března 2013 ve 12:58 hodin

Datum - Určuje časové pásmo, lokalizuje a formátuje čas v PHP

  • PHP

Když při vývoji webového projektu vyvstane úkol vzít v úvahu časová pásma uživatelů, pokaždé se zdá, že řešení musí být znovu vynalezeno. Z mnoha známých projektů, které tento problém řešily, si nepamatuji jediné řešení, které by se dalo nazvat jednoduchým, transparentním pro celou architekturu a univerzálním.

Co když ale chcete jen pár řádků kódu, a aby zbytek kódu nikdy nezjistil, že data je třeba odeslat klientovi v jiném časovém pásmu a že v datech přijatých od klienta může být čas uveden v jiném časovém pásmu než na serveru? K vyřešení tohoto a mnoha dalších problémů vám dnes povím o jedné stručné a funkční knihovně pro PHP.

A tak se seznamte s Daterem a jeho hlavními rysy:

  • Vázací formáty
  • Lokalizace textů a formátů
  • Rozšíření seznamu možností formátování
  • Automatická detekce časového pásma
  • Převést čas na základě časového pásma
  • Automatický převod času na $_GET, $_POST, $_REQUEST s ohledem na časové pásmo
  • Automatický převod časového pásma v odeslané šabloně dat
Slíbené řádky kódu automatická detekce Zpracování uživatelského časového pásma si necháme jako dezert, ale nyní si projdeme hlavní funkce Dateru stručně s příklady.

Vázací formáty

Umožňuje standardizovat sadu formátů používaných pro projekt a pracovat s nimi podle názvu:

$dater = new Date\Dater(new Date\Locale\En()); $datum->format(time(), "d/m/Y"); // 2013/03/14 $dater->addFormat("slashedDate", "d/m/Y"); $dater->format(time(), "slashedDate"); // 2013/03/14 $dater->slashedDate(time()); // 2013/03/14

Rozšíření možností formátování

K dispozici jsou všechny možnosti formátování od date() a lze je také přepsat a rozšířit:

$dater->addFormatOption("ago", funkce (DateTime $datetime) ( return floor((time() - $datetime->getTimestamp()) / 86400) . "days ago"; )); $dater->format(time() - 60*60*24*7, "d F Y, ago"); // 14. března 2013, před 7 dny

Podpora národního prostředí

$dater->setLocale(new Date\Locale\En()); echo $dater->date(); // 21.03.2013 echo $dater->now("j F Y"); // 21. března 2013 $dater->setLocale(Dater\Dater::getLocaleByCode("ru")); echo $dater->date(); // 21.03.2013 echo $dater->now("j F Y"); // 21. března 2013

Standardní metody pro serverové a uživatelské formáty s ohledem na národní prostředí

echo $dater->date(); // 21.03.2013 (časové pásmo klienta, závisí na národním prostředí) echo $dater->time(); // 5:41 (časové pásmo klienta, závisí na národním prostředí) echo $dater->datetime(); // 21.03.2013 5:41 (časové pásmo klienta, závisí na národním prostředí) echo $dater->isoDate(); // 2013-03-21 (časové pásmo klienta) echo $dater->isoTime(); // 05:41:28 (časové pásmo klienta) echo $dater->isoDatetime(); // 2013-03-21 05:41:28 (časové pásmo klienta) echo $dater->serverDate(); // 2013-03-21 (časové pásmo serveru) echo $dater->serverTime(); // 09:41:28 (časové pásmo serveru) echo $dater->serverDatetime(); // 2013-03-21 09:41:28 (časové pásmo serveru)

Převod data a času s ohledem na časové pásmo

$dater->setServerTimezone("Evropa/Moskva"); $dater->setClientTimezone("Evropa/Londýn"); echo $dater->serverDatetime(); // 2013-03-21 08:18:06 echo $dater->isoDatetime(); // 2013-03-21 04:18:06 echo $dater->time(); // 04:18
Za zmínku stojí, že při volání $dater->setServerTimezone("Europe/Moscow"); Funkce date() a třída DateTime vrátí čas v nově nastaveném časovém pásmu. Chcete-li to zakázat, předejte metodě jako druhý parametr hodnotu false.

A nakonec to, co bylo slíbeno

Kód, který vám umožní automaticky určit časové pásmo klienta a zobrazit pro něj aktuální datum a čas:

V záhlaví globálního init skriptu

$dater = new Date\Dater(new Date\Locale\Ru(), "Evropa/Moskva"); $timezoneDetector = new Date\TimezoneDetector(); $dater->setClientTimezone($timezoneDetector->getClientTimezone()); $dataHandler = new Dater\DataHandler($dater); $dataHandler->enableOutputTimezoneHandler(); $dataHandler->convertRequestDataToServerTimezone();
V hlavní šabloně

getHtmlJsCode() ?>
Nyní budou všechny řetězce RRRR-MM-DD HH:MM:SS v odesílaných datech nahrazeny řetězcem RRRR-MM-DD HH:MM:SS v automaticky zjištěném časovém pásmu klienta. Pokud potřebujete zobrazit datum a čas v určitém formátu, stačí přidat RRRR-MM-DD HH:MM:SS[N m d] nebo RRRR-MM-DD HH:MM:SS, kde datum je formát svázaný s datem . Můžete také vytisknout a naformátovat formát časového razítka: 1363853607.

Například následující údaje

Formát časového razítka: 1363238564 (nezmění se) Formát časového razítka: 1363238564 Formát časového razítka: 1363238564 Formát data a času serveru: 2013-03-14 09:22:44 Formát data a času serveru: 2013-03-14: 09 Formát data a času serveru: 2213-03-14 09 09 - 03-14 09:22:44


Bude automaticky převedeno na

Formát časového razítka: 1363238564 (nezmění se) Formát časového razítka: 2013/03/14 Formát časového razítka: 14. 3. 2013 07:22 Formát data a času serveru: 2013/03/14 Formát data a času serveru: 07:22 Formát data a času serveru: 2013- 03-14 07:22:44

Současně $dataHandler->convertRequestDataToServerTimezone(); zajistí, že všechna data RRRR-MM-DD HH:MM:SS přicházející z klienta budou převedena na časové pásmo serveru RRRR-MM-DD HH:MM:SS. Tímto způsobem se server nikdy nedozví, že klient přijímá a odesílá datum a čas v jiném časovém pásmu.

Nutno uznat, že jde o trochu extrémní způsob zacházení s časovými pásmy. Univerzálnějším a tradičním řešením by bylo vyhnout se použití $dataHandler->enableOutputTimezoneHandler(); a jednoduše zarámujte vložení každého data a času voláním příslušné metody formátování. Napříkladdate($datetimeOrTimestamp) ?> .

o projektu

Upřímně se přiznám, že jsem autorem této knihovny a budu velmi vděčný za jakoukoli kritiku a pomoc při jejím vylepšení. Zdroje jsou zveřejněny na

Nastavení časového pásma (výchozí) je velmi potřebné pro správné zpracování dat. Tento článek, Nastavení časového pásma v php.ini, vám pomůže zjistit, jak můžete nastavit časové pásmo v konfiguračním souboru PHP (php.ini) nebo uvnitř libovolného PHP skriptu pro dočasné použití.

Nastavení časového pásma v php.ini

Chcete-li nastavit výchozí časové pásmo pro vaše prostředí PHP, postupujte podle těchto 4 jednoduchých kroků.

1. Potřeba najít konfigurační soubor php.ini a to lze provést:

# find / -type f -name php.ini

Ve výchozím nastavení je php.ini umístěn v:

Pro CentOS, RedHat nebo Fedora bude:

/etc/php.ini

Pro Ubuntu, Debian nebo LinuxMint bude:

/etc/php5/apache2/php.ini

2. Dalším krokem je vyhledání časových pásem (pro vaši polohu), k tomu byste měli navštívit web a najít svou zónu pro php:

3. Registrujte nalezenou zónu v souboru php.ini. Například si vezmu svou zónu – ‚Evropa/Kyjev‘. Otevřete konfigurační soubor a proveďte změny:

[...] date.timezone = "Evropa/Kyjev" [...]

POZORNOST! Hledejte možnost „date.timezone“ v tento soubor, možná byl tento parametr již zaregistrován.
4. Restartujte webový server:

# restart služby httpd

# restart služby apache2

Pokud jiný server (nginx, tomcat, lighttpd), restartujte jej.

Tento parametr můžete také zadat v samotném souboru php takto:

Nastavení časového pásma v php.ini je dokončeno.

Pokud během řízení virtuální hosting Pokud je potřeba změnit výchozí časové pásmo, lze tuto akci snadno provést v několika krocích, které jsou popsány níže.

Změna časového pásma pomocí Select PHP Version

Chcete-li změnit časové pásmo, přejděte na cPanel -> Software -> Vyberte verzi PHP -> Přepněte na možnosti PHP.

Dalším krokem je změna hodnoty proměnné datum.časové pásmo do požadovaného časového pásma. Seznam dostupných časových pásem naleznete v posledním odstavci článku.

Po provedení potřebných změn je důležité kliknout na tlačítko "Uložit změny", který se nachází v dolní části stránky PHP Selector.

Chcete-li zajistit, že byla použita zadaná hodnota časového pásma, můžete použít funkci PHP phpinfo(), která zobrazuje informace o všech nastavit parametry php. Chcete-li to provést, vytvořte v public_html klikněte na tlačítko "Soubor" v dispečerském menu.

  • V terénu Nový název souboru uvést např. phpinfo.php poté klikněte na tlačítko Vytvořit nový soubor.

  • V důsledku toho soubor s zadané jméno se objeví v seznamu ostatních na hostingu.
  • Dále musíte tento soubor otevřít pro úpravy. Chcete-li to provést, klepněte levým tlačítkem myši na požadovaný soubor, poté v nabídce dispečer klikněte na tlačítko Změna.
  • V zobrazeném formuláři ponechte všechny výchozí parametry a klikněte na tlačítko Upravit, otevřete textový editor.

  • V okně, které se otevře, musíte zadat následující kód:

Poté soubor uložte a otevřete v prohlížeči. V v tomto příkladu soubor bude dostupný na:

http://main_domain/phpinfo.php

Na stránce, která se otevře, najděte sekci datum, která bude obsahovat tabulku s hodnotou aktuálního časového pásma. V tomto případě se zobrazí výše uvedená zóna Evropa/Kyjev.

Tím je proces změny časového pásma dokončen.

Seznam časových pásem pro konfiguraci časového pásma

Níže navíc přikládáme seznam možné hodnotyčasové pásmo:

Afrika/Káhira Afrika/Casablanca Afrika/Harare Afrika/Monrovia Afrika/Nairobi Amerika/Bogota Amerika/Buenos_Aires Amerika/Caracas Amerika/Chihuahua Amerika/La_Paz Amerika/Lima Amerika/Mazatlan Amerika/Mexico_City Amerika/Monterrey Amerika/Santiago Amerika/Tijuana Almaty Asie/Bagdád Asie/Baku Asie/Bangkok Asie/Chongqing Asie/Dháka Asie/Hong_Kong Asie/Irkutsk Asie/Jakarta Asie/Jeruzalém Asie/Kábul Asie/Karachi Asie/Káthmandu Asie/Kalkata Asie/Krasnojarsk Asie/Kuala_Lumpur Asie /Magadan Asie/Muscat Asie/Novosibirsk Asie/Rijád Asie/Soul Asie/Singapur Asie/Tchaj-pej Asie/Taškent Asie/Tbilisi Asie/Teherán Asie/Tokio Asie/Ulánbátar Asie/Urumči Asie/Vladivostok Asie/Jakutsk Asie/Jekatěrinburg Asie/Yekaterinburg Atlantik/Azory Atlantik/Cape_Verde Atlantik/Stanley Austrálie/Adelaide Austrálie/Brisbane Austrálie/Canberra Austrálie/Darwin Austrálie/Hobart Austrálie/Melbourne Austrálie/Perth Austrálie/Sydney Kanada/Atlantik Kanada/Newfoundland Kanada/Saskatchewan Evropa/Amsterdam Evropa/Athény Evropa/ Bělehrad Evropa/Berlín Evropa/Bratislava Evropa/Brusel Evropa/Bukurešť Evropa/Budapešť Evropa/Kodaň Evropa/Dublin Evropa/Helsinki Evropa/Istanbul Evropa/Kyjev Evropa/Lisabon Evropa/Ljubljana Evropa/Londýn Evropa/Madrid Evropa/Minsk Evropa/Moskva Evropa /Paříž Evropa/Praha Evropa/Riga Evropa/Řím Evropa/Sarajevo Evropa/Skopje Evropa/Sofie Evropa/Stockholm Evropa/Tallin Evropa/Vídeň Evropa/Vilnius Evropa/Volgograd Evropa/Varšava Evropa/Záhřeb Grónsko Pacifik/Auckland Pacifik/Fidži Pacifik/ Guam Pacific/Midway Pacific/Port_Moresby USA/Aljaška USA/Arizona USA/Střední USA/Východní USA/Východní Indie USA/Havaj USA/Pohoří USA/Pacifik USA/Samoa

Chcete nový název pro svůj web? K dostání u nás