0Pricing
PHP Academy · درس

المناطق الزمنية في PHP

تعاملوا مع مناطق زمنية متعددة باستخدام DateTimeZone وdate_default_timezone_set

المناطق الزمنية في PHP درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.

أهمية المناطق الزمنية

إذا كان تطبيقك يخدم مستخدمين من جميع أنحاء العالم، فإن التعامل مع المناطق الزمنية أمر بالغ الأهمية. تستخدم PHP دوالًا وفئات تدرك المناطق الزمنية لإجراء التحويلات بشكل صحيح.

  • خزّن الأوقات دائمًا بتوقيت UTC في قاعدة البيانات
  • حوّل الوقت إلى المنطقة الزمنية المحلية للمستخدم فقط عند عرضه

date_default_timezone_set()

عيّن المنطقة الزمنية الافتراضية لجميع دوال التاريخ:

<?php
// Set at the top of your script or in php.ini
date_default_timezone_set('Europe/Istanbul');

echo date('Y-m-d H:i:s');  // local Istanbul time
echo PHP_EOL;

date_default_timezone_set('UTC');
echo date('Y-m-d H:i:s');  // UTC time

// Or set in php.ini:
// date.timezone = "Europe/London"

فئة DateTimeZone

أنشئ كائنات للمناطق الزمنية لاستخدامها مع DateTime:

<?php
$utc      = new DateTimeZone('UTC');
$istanbul = new DateTimeZone('Europe/Istanbul');
$ny       = new DateTimeZone('America/New_York');

$dt = new DateTime('now', $utc);
echo $dt->format('Y-m-d H:i:s T');  // UTC time

التحويل بين المناطق الزمنية

حوّل كائن DateTime إلى منطقة زمنية مختلفة باستخدام setTimezone():

<?php
$utcTime = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));

$istanbul = clone $utcTime;
$istanbul->setTimezone(new DateTimeZone('Europe/Istanbul'));

$newYork = clone $utcTime;
$newYork->setTimezone(new DateTimeZone('America/New_York'));

echo 'UTC:      ' . $utcTime->format('H:i T')  . PHP_EOL;
echo 'Istanbul: ' . $istanbul->format('H:i T') . PHP_EOL;
echo 'New York: ' . $newYork->format('H:i T')  . PHP_EOL;

getOffset() وDST

احصل على فارق التوقيت عن UTC بالثواني وتحقق من التوقيت الصيفي:

<?php
$tz = new DateTimeZone('America/New_York');
$dt = new DateTime('now', $tz);

$offset = $tz->getOffset($dt);        // offset in seconds
$offsetHours = $offset / 3600;
echo 'Offset: ' . $offsetHours . 'h'; // e.g. -5 or -4 in DST

$transitions = $tz->getTransitions(
    strtotime('2024-01-01'),
    strtotime('2024-12-31')
);
echo 'DST changes in 2024: ' . count($transitions);

التخزين بتوقيت UTC والعرض محليًا

أفضل ممارسة: خزّن الوقت بتوقيت UTC في قاعدة البيانات، واعرض الوقت المحلي للمستخدم:

<?php
// Store: always save as UTC
$createdAt = (new DateTimeImmutable('now', new DateTimeZone('UTC')))
    ->format('Y-m-d H:i:s');

// Display: convert to user's timezone
$userTz  = new DateTimeZone($user['timezone'] ?? 'UTC');
$display = (new DateTime($createdAt, new DateTimeZone('UTC')))
    ->setTimezone($userTz)
    ->format('d M Y, H:i T');

اكتشاف المنطقة الزمنية للمستخدم

اكتشف المنطقة الزمنية للمستخدم وخزّنها لأغراض العرض:

// JavaScript: detect and send to PHP:
// const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
// fetch('/api/set-timezone', { method:'POST', body: tz });

<?php
// PHP: validate and store
$tz = $_POST['timezone'] ?? 'UTC';
$valid = in_array($tz, DateTimeZone::listIdentifiers());

if ($valid) {
    $_SESSION['timezone'] = $tz;
    setcookie('user_tz', $tz, time() + 365 * 86400);
}

DateTimeZone::listIdentifiers()

احصل على جميع معرّفات المناطق الزمنية الصالحة:

<?php
// All identifiers
$all = DateTimeZone::listIdentifiers();
echo count($all) . ' timezones available';

// Filter by region
$europe = DateTimeZone::listIdentifiers(DateTimeZone::EUROPE);
echo count($europe) . ' European timezones';

// Check if a timezone string is valid
function isValidTimezone(string $tz): bool {
    return in_array($tz, DateTimeZone::listIdentifiers());
}
var_dump(isValidTimezone('Europe/Istanbul')); // true

تنسيق فارق المنطقة الزمنية

نسّق فارق المنطقة الزمنية لعرضه وفي واجهات API:

<?php
$dt = new DateTime('now', new DateTimeZone('America/Los_Angeles'));

echo $dt->format('P');     // +05:30 or -07:00
echo $dt->format('O');     // +0530 (no colon)
echo $dt->format('T');     // PST or PDT
echo $dt->format('e');     // America/Los_Angeles
echo $dt->format('Z');     // offset in seconds

الطوابع الزمنية لـ Unix محايدة زمنيًا

تمثّل الطوابع الزمنية لـ Unix لحظةً محددة في الزمن بغض النظر عن المنطقة الزمنية — استخدمها للمقارنات والحسابات:

<?php
// These represent the same moment:
$utc   = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));
$ist   = new DateTime('2024-05-27 15:00:00', new DateTimeZone('Asia/Kolkata'));

echo $utc->getTimestamp();   // same timestamp
echo $ist->getTimestamp();   // same timestamp

var_dump($utc->getTimestamp() === $ist->getTimestamp()); // true

date_create مع المنطقة الزمنية

التعامل الإجرائي مع المناطق الزمنية باستخدام date_create وdate_timezone_set:

<?php
$dt = date_create('now', timezone_open('UTC'));
$tz = timezone_open('Europe/Istanbul');

date_timezone_set($dt, $tz);
echo date_format($dt, 'Y-m-d H:i:s T');

// Check transition info
$info = timezone_transitions_get($tz);
echo 'Current offset: ' . ($info[0]['offset'] / 3600) . 'h';

تحقق سريع

أين ينبغي تخزين التواريخ والأوقات في قاعدة البيانات لتطبيق موزّع عالميًا؟

مراجعة: المناطق الزمنية في PHP

أساسيات المناطق الزمنية:

  • عيّن المنطقة الزمنية الافتراضية باستخدام date_default_timezone_set()
  • استخدم كائنات DateTimeZone مع DateTime
  • استخدم setTimezone() للتحويل بين المناطق الزمنية
  • خزّن الوقت دائمًا بتوقيت UTC في قاعدة البيانات
  • تحقق من المناطق الزمنية للمستخدمين باستخدام DateTimeZone::listIdentifiers()
  • تمثّل الطوابع الزمنية لـ Unix لحظات زمنية محايدة بالنسبة إلى المناطق الزمنية

الأسئلة الشائعة

هل درس «المناطق الزمنية في PHP» مجاني؟

نعم — نص درس «المناطق الزمنية في PHP» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.

ماذا ستتعلم في «المناطق الزمنية في PHP»؟

تعاملوا مع مناطق زمنية متعددة باستخدام DateTimeZone وdate_default_timezone_set تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟

لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «المناطق الزمنية في PHP»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟

نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الطوابع الزمنية لـ Unix وdate()
  2. الفئة DateTime
  3. حساب التواريخ باستخدام DateInterval
  4. المناطق الزمنية في PHP
← العودة إلى PHP Academy