منطقه زمانی کاربر Php. روش درست برای نگاه کردن به مناطق زمانی در PHP

تسمه اتوماتیک (6)

من باید بدانم که کاربران من بر اساس IP یا هدر HTTP آنها در چه منطقه زمانی هستند.

پاسخ های زیادی برای این سوال دریافت کردم، اما نتوانستم پاسخ را بفهمم. برخی می گویند با استفاده از -new Date().getTimezoneOffset()/60(). اما این به چه معناست؟

من date_default_timezone_set ("آسیا/کلکته") را دارم. در ریشه صفحه من (index.php). بنابراین برای این کار باید منطقه زمانی را به صورت پویا تنظیم کنم و به جای آن روی آسیا/کلکته تنظیم کنم.

پاسخ ها

اطلاعات منطقه زمانی مرورگر بخشی از مشخصات HTTP نیست، بنابراین نمی توانید آن را فقط از هدر دریافت کنید.

اگر مختصات مکان دارید (مثلاً با دستگاه تلفن همراه GPS)، می توانید منطقه زمانی خود را با استفاده از یکی از این روش ها پیدا کنید. با این حال، موقعیت جغرافیایی با آدرس IP راه حل خوبی نیست، زیرا اغلب آدرس IP ISP یا سرور پراکسی، که ممکن است در منطقه زمانی متفاوتی باشد.

برخی از استراتژی‌ها وجود دارد که می‌توانید از آنها برای شناسایی منطقه زمانی استفاده کنید، مانند استفاده از کتابخانه jsTimeZoneDetect، که یک نقطه شروع عالی است، اما آنقدر کامل نیست که نتوانید به تنهایی به آن تکیه کنید. اگر از moment.js استفاده می کنید، moment-time یک تابع داخلی به نام moment.tz.guess() دارد که همان کار را انجام می دهد.

مشکل استفاده از تابع getTimezoneOffset() جاوا اسکریپت این است که منطقه زمانی را دریافت نمی کنید - فقط یک افست برای یک تاریخ خاص. به بخش ویکی موضوع برچسب TimeZone با عنوان "TimeZone! = افست."

به هر حال که به آن نگاه کنید، در نهایت باید یکی از این دو رویکرد را انتخاب کنید:

  • از کاربر بخواهید منطقه زمانی خود را از طریق نوعی لیست کشویی یا کنترل های منطقه زمانی مبتنی بر نقشه به شما بگوید.
  • فقط زمان را به مرورگر در UTC ارسال کنید و از جاوا اسکریپت در مرورگر برای تبدیل به منطقه زمانی محلی که کاربر رایانه خود را روی آن تنظیم کند استفاده کنید.

من این را با جزئیات بیشتری (از دیدگاه AC#) در این پاسخ مورد بحث قرار می دهم.

منطقه زمانی در سرصفحه HTTP در دسترس نیست، اما کشور (مخفف) در سرصفحه ACCEPT_LANGUAGE است. چیزی شبیه "en-US" (ایالات متحده آمریکا - کد کشور) خواهد بود. این می تواند با اطلاعات جاوا اسکریپت ترکیب شود تا از منطقه زمانی کاربر ایده بگیرد.

این چیزی است که من در JS استفاده می کنم:

تابع 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; }

این یک رشته مانند "-6S1" را برای منطقه مرکزی برمی گرداند (تغییر زمان استاندارد 6- ساعت است، زمان صرفه جویی در تابستان در تابستان اعمال می شود و 1 ساعت اضافه می کند). من از کوکی‌ها استفاده می‌کنم تا این را برای PHP در دسترس قرار دهم. PHP پایگاه داده TZ را برای مناطقی که با این کشور و کشور مطابقت دارند جستجو می کند. برای اینجا (US، -6S1) 7 منطقه مربوطه وجود دارد، اولین منطقه "آمریکا / شیکاگو" است.

به هر حال، دو منطقه در پایگاه داده وجود دارد که DST چیزی غیر از 1 ساعت اضافه می کند: جزیره لرد هاو (10.5W0.5) و ایستگاه ترول، قطب جنوب (0W2).

یکی از آنها این است که از آنها بپرسید! مخصوصاً در آن دسته از سیستم‌های عضوی که می‌توانید کاربر را جذب/ثبت کنید - در آن مرحله به آنها حق انتخاب بدهید. ساده اما دقیق

این عالی کار میکنه...

اکو

پس از آن فایل را ذخیره کرده و در مرورگر خود باز کنید. در در این مثالفایل در آدرس زیر در دسترس خواهد بود:

http://main_domain/phpinfo.php

در صفحه ای که باز می شود، بخش تاریخ را پیدا کنید که حاوی جدولی با مقدار منطقه زمانی فعلی است. در این حالت منطقه فوق نمایش داده می شود اروپا/کیف.

این فرآیند تغییر منطقه زمانی را کامل می کند.

فهرست مناطق زمانی برای پیکربندی منطقه زمانی

علاوه بر این، ما یک لیست را در زیر پیوست می کنیم مقادیر ممکنمنطقه زمانی:

آفریقا / قاهره آفریقا / کازابلانکا آفریقا / هراره آفریقا / مونرویا آفریقا / نایروبی آمریکا / بوگوتا آمریکا / بوئنوس_آیرس آمریکا / کاراکاس آمریکا / چیهواهوا آمریکا / لا_پاز آمریکا / لیما آمریکا / مازاتلان آمریکا / مکزیک_شهر آمریکا / مونتری آمریکا / سانتیاجوآنا آمریکا / T آلماتی آسیا/بغداد آسیا/باکو آسیا/بانکوک آسیا/چونگ کینگ آسیا/داکا آسیا/هنگ_کنگ آسیا/ایرکوتسک آسیا/جاکارتا آسیا/اورشلیم آسیا/کابل آسیا/کراچی آسیا/کاتماندو آسیا/کلکته آسیا/کراسنویارسک آسیا/کوالا_لومپور آسیا/Ku /ماگادان آسیا/مسقط آسیا/نووسیبیرسک آسیا/ریاض آسیا/سئول آسیا/سنگاپور آسیا/تایپه آسیا/تاشکند آسیا/تفلیس آسیا/تهران آسیا/توکیو آسیا/اولان‌باتور آسیا/اورومچی آسیا/ولادیووستوک آسیا/یاکوتسک آسیا/یکاترینبورگ اقیانوس اطلس / آزور آتلانتیک / کیپ ورد اقیانوس اطلس / استنلی استرالیا / آدلاید استرالیا / بریزبن استرالیا / کانبرا استرالیا / داروین استرالیا / هوبارت استرالیا / ملبورن استرالیا / پرت استرالیا / سیدنی کانادا / آتلانتیک کانادا / نیوفاندلند کانادا / ساسکاچوان اروپا / ساسکاچوان اروپا / اروپا بلگراد اروپا / برلین اروپا / براتیسلاوا اروپا / بروکسل اروپا / بخارست اروپا / بوداپست اروپا / کپنهاگ اروپا / دوبلین اروپا / هلسینکی اروپا / استانبول اروپا / کیف اروپا / لیسبون اروپا / لیوبلیانا اروپا / لندن اروپا / مادرید اروپا / مینسک اروپا / مسکو اروپا /پاریس اروپا / پراگ اروپا / ریگا اروپا / رم اروپا / سارایوو اروپا / اسکوپیه اروپا / صوفیه اروپا / استکهلم اروپا / تالین اروپا / وین اروپا / ویلنیوس اروپا / ولگوگراد اروپا / ورشو اروپا / زاگرب گرینلند اقیانوس آرام / اوکلند اقیانوس آرام / اقیانوس آرام فیجی / گوام اقیانوس آرام/میدوی اقیانوس آرام/پورت_مورزبی ایالات متحده/آلاسکا ایالات متحده/آریزونا ایالات متحده آمریکا/آمریکا مرکزی/شرق آمریکا/ایندیانای شرقی ایالات متحده آمریکا/هاوایی ایالات متحده آمریکا/کوه ایالات متحده آمریکا/اقیانوس آرام آمریکا/ساموآ

آیا می خواهید یک نام جدید برای وب سایت خود داشته باشید؟ از ما در دسترس است

گاهی اوقات شرایطی پیش می آید که زمان فعلی روی سرور با منطقه زمانی فعلی شما یا منطقه زمانی منطقه ای که سایت شما به آن هدف قرار گرفته است مطابقت ندارد.

برای روشن شدن موضوع، اجازه دهید به شما یادآوری کنم: روسیه از نظر جغرافیایی بسیار بزرگ است و همه به سایت های خود برای "زندگی" طبق زمان مسکو نیاز ندارند. به عنوان مثال، اورال، سیبری، خاور دور و غیره.

سرورهای محبوب ترین ارائه دهندگان هاست روسیواقع در سایت های فناوری مسکو و سنت پترزبورگ و به طور پیش فرض، البته برای منطقه زمانی مسکو پیکربندی شده است. سرور نمی تواند به طور خودکار مکان فعلی شما را تنظیم کند و ساعت سیستم را تنظیم کند. بنابراین، عملکرد تاریخ و زمان در سایت ممکن است کاملاً صحیح نباشد. به طور طبیعی، اکنون ما در مورد CMS صحبت نمی کنیم، که در آن تنظیم منطقه زمانی معمولاً به طور مستقیم در رابط مدیر وجود دارد.

ابتدا بررسی کنید وضعیت فعلیبا استفاده از کد PHP:

echo ini_get("date.timezone");

خوب است اگر سرور خود را داشته باشید و به php.ini دسترسی داشته باشید، جایی که می توانید منطقه زمانی مورد نظر را تنظیم کنید و آن را فراموش کنید. مثلا به این صورت:

Date.timezone = اروپا/مسکو

با این حال، اگر سرور میزبان چندین پروژه است که باید از مناطق زمانی مختلف پشتیبانی کند، بهتر است این کار را انجام ندهید. در این صورت، تعیین مناطق زمانی فقط برای پروژه هایی با منطقه زمانی یکسان، صحیح تر خواهد بود.

تنظیم منطقه زمانی به میزبانی مجازی

در هاست اشتراکی، اغلب دسترسی به تنظیمات سرور وجود ندارد.

بنابراین، ابتدا سعی کنید منطقه زمانی را با استفاده از htaccess تنظیم کنید. فقط کافی است یک فایل .htaccess را در ریشه سایت خود پیدا یا ایجاد کنید و خط زیر را به آن اضافه کنید:

Php_value date.timezone "اروپا/مسکو"

اگر روش کار نکرد، از تابع date_default_timezone_set() استفاده می کنیم که منطقه زمانی پیش فرض را برای همه توابع تاریخ و زمان تعیین می کند. برای انجام این کار، فقط باید خط زیر را در جایی در ابتدای اسکریپت اضافه کنید:

Date_default_timezone_set("اروپا/مسکو");

  • طبیعتاً اروپا/مسکو به منطقه زمانی مورد نیاز شما تغییر می کند. برای قلمرو فدراسیون روسیه، PHP از مناطق زمانی زیر پشتیبانی می کند:
  • اروپا / مسکو
  • اروپا/سامارا
  • اروپا/کالینینگراد
  • اروپا/ولگوگراد
  • آسیا/آنادیر
  • آسیا/کامچاتکا
  • آسیا/کراسنویارسک
  • آسیا/ماگادان
  • آسیا/نووکوزنتسک
  • آسیا/نووسیبیرسک
  • آسیا/امسک
  • آسیا/ساخالین
  • آسیا/ولادی وستوک
  • آسیا/یاکوتسک

آسیا/یکاترینبورگ

می‌توانید با دنبال کردن پیوند یا اجرای دستوری فهرستی از مناطق زمانی موجود را مشاهده کنید که فهرستی از مناطق زمانی موجود در سرور شما را به شما نشان می‌دهد.

گاهی اوقات لازم است سایتی ایجاد کنید که در آن زمان با منطقه زمانی کاربر تنظیم شود. این کار آسان نیست به این معنا که تعیین منطقه زمانی کاربر مشکل ساز است. بنابراین در 99 درصد موارد زمان مربوط به منطقه زمانی سرور نمایش داده می شود. اما بیایید بفهمیم که چگونه می توانید زمان را با در نظر گرفتن منطقه زمانی یک کاربر خاص نمایش دهید.

همانطور که قبلاً نوشتم ، تعیین منطقه زمانی کاربر دشوار است ، در مقاله بعدی در مورد آن صحبت خواهیم کرد. در حال حاضر، ما فرض می کنیم که ما از قبل نسبت به زمان سرور زمان جبران را می دانیم.

بهتر است زمان سرور را روی زمان گرینویچ تنظیم کنید. و تمام داده ها باید در طول زمان بر اساس میانگین زمان گرینویچ ذخیره شوند. قبلاً یک بار نوشتم که لازم است در همان پایگاه داده نه قالب رشته ای تاریخ و زمان، بلکه عددی، یعنی فرمتی که توسط تابع time() برگردانده شده است، ذخیره شود.

بیایید به یک کد کوچک نگاه کنیم:

این تقریباً نحوه نمایش زمان با در نظر گرفتن منطقه زمانی کاربر در PHP است. البته شما نمی توانید زمان پیش فرض را بر روی میانگین زمان گرینویچ تنظیم کنید، اما نسبت به زمان سرور، مقدار افست را دریابید. با این حال، در مقاله بعدی در مورد جابجایی صحبت خواهیم کرد.