Časové pásmo používateľa PHP. Správny spôsob, ako sa pozrieť na časové pásma v PHP

automatické pásy (6)

Potrebujem vedieť, v akom časovom pásme sa moji používatelia nachádzajú na základe ich hlavičky IP alebo HTTP.

Na túto otázku som dostal veľa odpovedí, ale odpovedi som nerozumel. Niektorí hovoria pomocou -new Date().getTimezoneOffset()/60(). Ale čo to znamená?

Mám date_default_timezone_set("Ázia/Kalkata"); v koreňovom adresári mojej stránky (index.php). Preto musím dynamicky nastaviť časové pásmo a nastaviť ho na Áziu/Kalkatu.

Odpovede

Informácie o časovom pásme prehliadača nie sú súčasťou špecifikácie HTTP, takže ich nemôžete získať len z hlavičky.

Ak máte súradnice polohy (napr mobilné zariadenie GPS), svoje časové pásmo môžete nájsť pomocou jednej z týchto metód. Geolokácia podľa IP adresy však nie je skvelým riešením, pretože často ide o IP adresu ISP alebo proxy servera, ktorý môže byť v inom časovom pásme.

Existuje niekoľko stratégií, pomocou ktorých sa môžete pokúsiť zistiť časové pásmo, napríklad pomocou knižnice jsTimeZoneDetect, ktorá je skvelým východiskovým bodom, no nie je dostatočne dokonalá, aby ste sa na ňu nemohli spoľahnúť. Ak používate moment.js, moment-time má vstavanú funkciu s názvom moment.tz.guess(), ktorá robí to isté.

Čo je zlé na myšlienke použitia funkcie getTimezoneOffset() JavaScriptu je, že nezískate časové pásmo – iba jeden posun pre konkrétny dátum. Pozrite si wiki sekciu s témou značky TimeZone s názvom „TimeZone! = Offset."

Akokoľvek sa na to pozriete, nakoniec sa musíte rozhodnúť pre jeden z dvoch prístupov:

  • Požiadajte používateľa, aby vám povedal svoje časové pásmo z nejakého druhu rozbaľovacieho zoznamu alebo ovládacích prvkov časového pásma na mape.
  • Posielajte čas do prehliadača iba v UTC a použite JavaScript v prehliadači na konverziu do akéhokoľvek miestneho časového pásma, do ktorého môže používateľ nastaviť svoj počítač.

V tejto odpovedi o tom diskutujem podrobnejšie (z pohľadu AC #).

Časové pásmo nie je dostupné v hlavičke HTTP, ale krajina (skratka) je v hlavičke ACCEPT_LANGUAGE. Bude to niečo ako „en-US“ (USA – kód krajiny). To možno skombinovať s informáciami JavaScript, aby ste získali predstavu o časovom pásme používateľa.

Toto používam v JS:

Funkcia 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; }

Toto vráti reťazec ako "-6S1" pre strednú zónu (štandardný časový posun je -6 hodín, letný čas platí v lete a pridáva 1 hodinu). Používam cookies, aby som to sprístupnil PHP. PHP hľadá v databáze TZ zóny, ktoré sa zhodujú s touto a krajinou. Pre tu (US, -6S1) existuje 7 zodpovedajúcich zón, prvá je „Amerika / Chicago“.

Mimochodom, v databáze sú dve zóny, kde DST pridáva niečo iné ako 1 hodinu: Lord Howe Island (10,5W0,5) a Troll Station, Antarktída (0W2).

Jedným z nich je opýtať sa ich! Najmä v tých členských systémoch, kde môžete zachytiť/zaregistrovať používateľa – dajte mu v tom momente na výber. Jednoduché, ale presné.

Toto funguje skvele...

Echo

Potom súbor uložte a otvorte ho v prehliadači. IN v tomto príklade súbor bude dostupný na:

http://main_domain/phpinfo.php

Na stránke, ktorá sa otvorí, nájdite časť dátumu, ktorá bude obsahovať tabuľku s hodnotou aktuálneho časového pásma. V tomto prípade sa zobrazí vyššie uvedená zóna Európa/Kyjev.

Týmto sa dokončí proces zmeny časového pásma.

Zoznam časových pásiem na konfiguráciu časového pásma

Okrem toho nižšie pripájame zoznam 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 America/La_Paz Amerika/Lima Amerika/Mazatlan America/Mexico_City Amerika/Monterrey Amerika/Santiago Amerika/Tijuana Almaty Ázia/Bagdad Ázia/Baku Ázia/Bangkok Ázia/Chongqing Ázia/Dháka Ázia/Hong_Kong Ázia/Irkutsk Ázia/Jakarta Ázia/Jeruzalem Ázia/Kábul Ázia/Karachi Ázia/Káthmandu Ázia/Kalkata Ázia/Krasnojarsk Ázia/Kuala_Lumpur Ázia /Magadan Ázia/Muscat Ázia/Novosibirsk Ázia/Rijád Ázia/Soul Ázia/Singapur Ázia/Taipei Ázia/Taškent Ázia/Tbilisi Ázia/Teherán Ázia/Tokio Ázia/Ulánbátar Ázia/Urumči Ázia/Vladivostok Ázia/Jakutsk Ázia/Jekaterinburg Ázia/Yekaterinburg Atlantic/Azores Atlantic/Cape_Verde Atlantic/Stanley Austrália/Adelaide Austrália/Brisbane Austrália/Canberra Austrália/Darwin Austrália/Hobart Austrália/Melbourne Austrália/Perth Austrália/Sydney Kanada/Atlantik Kanada/Newfoundland Kanada/Saskatchewan Európa/Amsterdam Európa/Atény Európa/ Belehrad Európa/Berlín Európa/Bratislava Európa/Brusel Európa/Bukurešť Európa/Budapešť Európa/Kodaň Európa/Dublin Európa/Helsinki Európa/Istanbul Európa/Kyjev Európa/Lisabon Európa/Ľubľana Európa/Londýn Európa/Madrid Európa/Minsk Európa/Moskva Európa /Paríž Európa/Praha Európa/Riga Európa/Rím Európa/Sarajevo Európa/Skopje Európa/Sofia Európa/Štokholm Európa/Tallin Európa/Viedeň Európa/Vilnius Európa/Volgograd Európa/Varšava Európa/Záhreb Grónsko Tichomorie/Auckland Tichomorie/Fidži Tichomorie/ Guam Pacific/Midway Pacific/Port_Moresby USA/Aljaška USA/Arizona USA/Stred USA/Východ USA/Východná India USA/Havaj USA/Pohorie USA/Tichomorie USA/Samoa

Chcete nový názov pre váš web? Dostupné u nás

Niekedy nastane situácia, že aktuálny čas na serveri nezodpovedá vášmu aktuálnemu časovému pásmu alebo časovému pásmu regiónu, na ktorý je vaša stránka zameraná.

Aby som to objasnil, dovoľte mi pripomenúť: Rusko je geograficky veľmi veľké a nie každý potrebuje, aby ich stránky „žili“ podľa moskovského času. Napríklad Ural, Sibír, Ďaleký východ atď.

Najpopulárnejšie servery Ruskí poskytovatelia hostingu umiestnené na technologických miestach v Moskve a Petrohrade a štandardne sú nakonfigurované, samozrejme, pre moskovské časové pásmo. Server sa nemôže automaticky prispôsobiť vašej aktuálnej polohe a upraviť systémové hodiny. Preto fungovanie funkcií dátumu a času na stránke nemusí byť úplne správne. Prirodzene, teraz nehovoríme o CMS, v ktorom je úprava časového pásma väčšinou prítomná priamo v administrátorskom rozhraní.

Prvá kontrola Aktuálny stav pomocou PHP kódu:

echo ini_get("date.timezone");

Je dobré, ak máte vlastný server a máte prístup k php.ini, kde si môžete nastaviť požadované časové pásmo a zabudnúť ho. Napríklad takto:

Date.timezone = Európa/Moskva

Ak však server hostí niekoľko projektov, ktoré musia podporovať rôzne časové pásma, je lepšie to nerobiť. V tomto prípade by bolo správnejšie nastaviť časové pásma len pre projekty s rovnakým časovým pásmom.

Nastavenie časového pásma na virtuálny hosting

Na zdieľanom hostingu väčšinou nie je prístup ku konfiguráciám servera. Preto si v prvom rade skúste nastaviť časové pásmo pomocou .htaccess. Stačí nájsť alebo vytvoriť súbor .htaccess v koreňovom adresári vašej lokality a pridať doň nasledujúci riadok:

Php_value date.timezone "Európa/Moskva"

Ak metóda nefunguje, potom použijeme funkciu date_default_timezone_set(), ktorá nastaví predvolené časové pásmo pre všetky funkcie dátumu a času. Ak to chcete urobiť, stačí pridať nasledujúci riadok niekde na začiatok skriptu:

Date_default_timezone_set("Európa/Moskva");

Prirodzene, Európa/Moskva sa zmení na časové pásmo, ktoré potrebujete. Pre územie Ruskej federácie PHP podporuje nasledujúce časové pásma:

  • Európa/Moskva
  • Európa/Samara
  • Európa/Kaliningrad
  • Európa/Volgograd
  • Ázia/Anadyr
  • Ázia/Kamčatka
  • Ázia/Krasnojarsk
  • Ázia/Magadan
  • Ázia/Novokuzneck
  • Ázia/Novosibirsk
  • Ázia/Omsk
  • Ázia/Sachalin
  • Ázia/Vladivostok
  • Ázia/Jakutsk
  • Ázia/Jekaterinburg

Zoznam všetkých dostupných časových pásiem môžete zobraziť kliknutím na odkaz alebo spustením príkazu, ktorý vám vráti zoznam časových pásiem dostupných na vašom serveri.

Print_r(DateTimeZone::listIdentifiers());

Niekedy je potrebné vytvoriť stránku, kde bude čas prispôsobený časovému pásmu používateľa. Táto úloha nie je jednoduchá v tom zmysle, že určenie časového pásma používateľa je problematické. Preto sa v 99% prípadov zobrazuje čas zodpovedajúci časovému pásmu servera. Poďme však zistiť, ako môžete zobraziť čas s prihliadnutím na časové pásmo konkrétneho používateľa.

Ako som už napísal, určiť časové pásmo používateľa je ťažké, o tom si povieme v ďalšom článku. Zatiaľ budeme predpokladať, že už poznáme časový posun vzhľadom na čas servera.

Najlepšie by bolo nastaviť čas servera na greenwichský čas. A všetky údaje musia byť uložené v priebehu času podľa greenwichského času. Už som raz písal, že do tej istej databázy je potrebné ukladať nie reťazcový formát dátumu a času, ale číselný, teda ten, ktorý vracia funkcia time().

Pozrime sa na malý kód:

Zhruba takto funguje zobrazovanie času s ohľadom na časové pásmo používateľa v PHP. Samozrejme, nemôžete nastaviť predvolený čas na greenwichský čas, ale zistiť posun vzhľadom na čas servera. O premiestňovaní si však povieme až v ďalšom článku.