Časové pásmo uživatele PHP. Správný způsob, jak se podívat na časová pásma v PHP

automatické pásy (6)

Potřebuji vědět, v jakém časovém pásmu se moji uživatelé nacházejí na základě jejich IP nebo HTTP hlavičky.

Na tuto otázku jsem dostal mnoho odpovědí, ale nerozuměl jsem odpovědi. Někteří říkají pomocí -new Date().getTimezoneOffset()/60(). Ale co to znamená?

Mám date_default_timezone_set("Asie/Kalkata"); v kořenovém adresáři mé stránky (index.php). Za tímto účelem musím dynamicky nastavit časové pásmo a místo toho jej nastavit na Asii/Kalkatu.

Odpovědi

Informace o časovém pásmu prohlížeče nejsou součástí specifikace HTTP, takže je nelze získat pouze z hlavičky.

Pokud máte souřadnice polohy (např mobilní zařízení GPS), své časové pásmo můžete najít pomocí jedné z těchto metod. Geolokace podle IP adresy však není skvělé řešení, protože často jde o IP adresu ISP nebo proxy serveru, který může být v jiném časovém pásmu.

Existují některé strategie, pomocí kterých se můžete pokusit zjistit časové pásmo, například pomocí knihovny jsTimeZoneDetect, která je skvělým výchozím bodem, ale není dostatečně dokonalá, abyste se na ni nemohli spolehnout. Pokud používáte moment.js, moment-time má vestavěnou funkci moment.tz.guess(), která dělá totéž.

Na myšlence použití funkce getTimezoneOffset() v JavaScriptu je špatné to, že nezískáte časové pásmo – pouze jeden posun pro konkrétní datum. Podívejte se na wiki sekci s tématem tagů TimeZone s názvem „TimeZone! = Offset."

Ať se na to podíváte jakkoli, nakonec se musíte rozhodnout pro jeden ze dvou přístupů:

  • Požádejte uživatele, aby vám řekl své časové pásmo z nějakého druhu rozevíracího seznamu nebo ovládacích prvků časového pásma na základě mapy.
  • Odesílejte čas do prohlížeče pouze v UTC a pomocí JavaScriptu v prohlížeči převeďte na jakékoli místní časové pásmo, do kterého může uživatel nastavit svůj počítač.

Diskutuji o tom podrobněji (z pohledu AC #) v této odpovědi.

V hlavičce HTTP není k dispozici časové pásmo, ale země (zkratka) je v hlavičce ACCEPT_LANGUAGE. Bude to něco jako "en-US" (USA - kód země). To lze kombinovat s informacemi o JavaScriptu, abyste získali představu o časovém pásmu uživatele.

Toto používám v JS:

Funkce timezone() ( var now = new Date(); var jano = new Date(now.getFullYear(), 0, 1).getTimezoneOffset()/-60; var julo = new Date(now.getFullYear(), 6 , 1).getTimezoneOffset()/-60; var tz = Math.min(jano, julo) if (jano != julo) tz += ((jano< julo) ? "S" : "W") + Math.abs(jano - julo); return tz; }

To vrátí řetězec jako "-6S1" pro střední zónu (standardní časový posun je -6 hodin, letní čas platí v létě a přidává 1 hodinu). Abych to zpřístupnil PHP, používám soubory cookie. PHP vyhledává v databázi TZ zóny, které odpovídají této a zemi. Zde (US, -6S1) existuje 7 odpovídajících zón, první je „Amerika / Chicago“.

Mimochodem, v databázi jsou dvě zóny, kde DST přidává něco jiného než 1 hodinu: Lord Howe Island (10.5W0.5) a Troll Station, Antarctica (0W2).

Jedním z nich je zeptat se jich! Zejména v těch členských systémech, kde můžete zachytit/registrovat uživatele – dejte jim v tu chvíli na výběr. Jednoduché, ale přesné.

Tohle funguje skvěle...

Echo

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 data, 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

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 virtuální hosting

Na sdíleném hostingu většinou není přístup ke konfiguracím serveru. Proto nejprve zkuste 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");

Evropa/Moskva se přirozeně změní na časové pásmo, které potřebujete. 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());

Někdy je potřeba vytvořit web, kde bude čas přizpůsoben časovému pásmu uživatele. Tento úkol není snadný v tom smyslu, že určení časového pásma uživatele je problematické. Proto se v 99 % případů zobrazuje čas odpovídající časovému pásmu serveru. Ale pojďme zjistit, jak můžete zobrazit čas s ohledem na časové pásmo konkrétního uživatele.

Jak jsem již psal, určení časového pásma uživatele je obtížné, o tom si povíme v dalším článku. Prozatím budeme předpokládat, že již známe časový posun vzhledem k času serveru.

Nejlepší by bylo nastavit čas serveru na Greenwichský čas. A všechna data musí být uložena v průběhu času podle greenwichského času. Už jsem jednou psal, že do stejné databáze je nutné ukládat nikoli řetězcový formát data a času, ale číselný, tedy ten, který vrací funkce time().

Podívejme se na malý kód:

Zhruba takto funguje zobrazování času s ohledem na časové pásmo uživatele v PHP. Samozřejmě nemůžete nastavit výchozí čas na Greenwichský čas, ale zjistit posun vzhledem k času serveru. O přemístění si však povíme až v příštím článku.