دوال الحساب والتاريخ

حساب الخصومات، وإعداد التقارير، وعرض عبارة «نُشر منذ 3 أيام»، وإنشاء أرقام الطلبات — تعد العمليات الحسابية وعمليات التعامل مع التواريخ أمراً أساسياً في كل تطبيق ويب.

1. الدوال الحسابية الشائعة

PHP
<?php
// Basic operations
echo abs(-5);             // 5 (absolute value)
echo ceil(3.14);          // 4 (round up)
echo floor(3.99);         // 3 (round down)
echo round(3.5);          // 4 (rounds .5 to nearest even)
echo round(3.14159, 2);   // 3.14 (2 decimal places)

// Min and max
echo max(3, 7, 2, 9);     // 9 (maximum)
echo min(3, 7, 2, 9);     // 2 (minimum)
echo max([5, 3, 9, 1]);   // 9 (arrays work too)

// Powers and roots
echo pow(2, 3);           // 8 (2 to the power of 3)
echo sqrt(16);            // 4 (square root)

// Random numbers
echo rand(1, 100);        // Random integer between 1 and 100
echo mt_rand(1, 1000);    // High-quality random (recommended)
echo random_int(1, 10);   // Cryptographically secure random (PHP 7+)
?>
💡 نصيحة: للحصول على أرقام عشوائية للاستخدام اليومي، استخدم mt_rand() — فهو أسرع بحوالي 4 أضعاف ويُنتج أرقامًا عشوائية أفضل من rand(). أما بالنسبة للقيم الحساسة من الناحية الأمنية مثل كلمات المرور والرموز المميزة، فاستخدم random_int() بدلاً من ذلك، فهو آمن من الناحية التشفيرية.


2. الدالة date()

date() هي الأداة الأساسية في لغة PHP لتنسيق التواريخ والأوقات باستخدام سلسلة تنسيق:

PHP
<?php
// Current date and time
echo date("Y-m-d");             // 2026-06-29
echo date("l, F j, Y");         // Monday, June 29, 2026
echo date("H:i:s");             // 14:30:45
echo date("Y-m-d H:i:s");       // 2026-06-29 14:30:45

// Day of week
echo date("l");                 // Monday (full weekday name)
echo date("w");                 // 1 (numeric day, 0 = Sunday)
?>

(1) أحرف التنسيق الموحد

الحرف المعنى مثال
Y السنة بأربعة أرقام 2026
y السنة مكونة من رقمين 26
m الشهر (مع إضافة أصفار من اليسار) 06
n الشهر (بدون حشو) 6
d اليوم (مع إضافة أصفار من اليسار) 09
j اليوم (بدون حشو) 9
H 24 ساعة (مع إضافة أصفار) 14
i الدقائق (مع ملء الفراغات بصفر) 30
s ثوانٍ (مع ملء الفراغات بصفر) 45

▶ مثال: تحويلات الطوابع الزمنية

PHP
<?php
// time(): current Unix timestamp (seconds since January 1, 1970)
$now = time();
echo $now;  // e.g. 1751101234

// date() accepts a timestamp as its second argument
echo date("Y-m-d H:i:s", $now);

// strtotime(): human-readable dates → timestamps
$ts = strtotime("2026-01-01 00:00:00");
echo date("F j, Y", $ts);  // January 1, 2026

// strtotime is surprisingly smart
echo date("Y-m-d", strtotime("+1 week"));     // One week from now
echo date("Y-m-d", strtotime("next Monday")); // Next Monday
echo date("Y-m-d", strtotime("last day of this month")); // Last day of this month
echo date("Y-m-d", strtotime("+3 months"));   // Three months from now
?>
▶ جرّب الكود
💡 نصيحة: يفهم strtotime() العبارات المكتوبة باللغة الطبيعية مثل +1 week وnext Monday وfirst day of next month. ومع ذلك، لا تعتمد عليه في العمليات الحسابية المعقدة المتعلقة بالتواريخ — استخدم فئة DateTime بدلاً من ذلك.


3. فئة DateTime

تغطي date() وstrtotime() الحالات البسيطة. أما بالنسبة للحالات الأكثر تعقيدًا، فيمكنك اللجوء إلى فئة DateTime — فهي موجهة للكائنات وأكثر قوة بكثير:

PHP
<?php
// Creating DateTime objects
$now = new DateTime();
$specific = new DateTime("2026-06-01 09:00:00");
$fromFormat = DateTime::createFromFormat("d/m/Y", "15/08/2026");

// Formatting output
echo $now->format("Y-m-d H:i:s");

// Adding and subtracting dates
$future = new DateTime();
$future->modify("+2 weeks");
$future->modify("+3 days");
echo $future->format("Y-m-d");  // Today + 17 days

// Calculating differences
$birthday = new DateTime("2000-01-15");
$today = new DateTime();
$diff = $birthday->diff($today);
echo "You have been alive for {$diff->days} days, {$diff->y} years";
// diff() returns a DateInterval object with y/m/d/h/i/s/days properties
?>

▶ مثال: مقارنة التواريخ والنطاقات

PHP
<?php
$start = new DateTime("2026-06-01");
$end   = new DateTime("2026-06-30");

// Comparing dates
if ($start < $end) {
    echo "Start date is before end date";
}

// Iterating over a date range
$period = new DateInterval("P7D");     // 7-day interval
$dates = new DatePeriod($start, $period, $end);
foreach ($dates as $date) {
    echo $date->format("m-d") . " ";
}
// Output: 06-01 06-08 06-15 06-22 06-29
?>
▶ جرّب الكود

4. تهيئة المنطقة الزمنية

PHP
<?php
// Set the timezone (do this once at the top of your script)
date_default_timezone_set("Asia/Shanghai");

echo date("Y-m-d H:i:s");  // Now shows Shanghai time

// Check the current timezone
echo date_default_timezone_get();  // Asia/Shanghai

// Common timezones:
// Asia/Shanghai    - China Standard Time (UTC+8)
// Asia/Tokyo       - Japan Standard Time (UTC+9)
// Europe/London    - Greenwich Mean Time / British Summer Time
// America/New_York - Eastern Time (UTC-5/UTC-4)
?>
⚠️ تحذير: المنطقة الزمنية الافتراضية في PHP هي UTC. إذا كان موقعك يخدم مستخدمين في منطقة معينة، فاحرص دائمًا على استدعاء date_default_timezone_set() في بداية البرنامج النصي. فبدون ذلك، قد تظهر الطوابع الزمنية على تعليقات المستخدمين متأخرة بـ 8 ساعات.


5. وصفات التمر في الحياة اليومية

PHP
<?php
// 1. Calculate age
function getAge(string $birthday): int {
    $born = new DateTime($birthday);
    $today = new DateTime();
    return $born->diff($today)->y;
}
echo getAge("2000-01-15");  // 26

// 2. Display relative time ("posted 3 days ago")
function timeAgo(string $datetime): string {
    $past = new DateTime($datetime);
    $now = new DateTime();
    $diff = $past->diff($now);

    if ($diff->y > 0)    return $diff->y . " year(s) ago";
    if ($diff->m > 0)    return $diff->m . " month(s) ago";
    if ($diff->d > 0)    return $diff->d . " day(s) ago";
    if ($diff->h > 0)    return $diff->h . " hour(s) ago";
    if ($diff->i > 0)    return $diff->i . " minute(s) ago";
    return "just now";
}

// 3. Generate an order number
function generateOrderNo(): string {
    return date("YmdHis") . mt_rand(1000, 9999);
}
echo generateOrderNo();  // 202606291430451234
?>

❓ أسئلة شائعة

س date() أم DateTime — أيهما يجب أن أستخدم؟
ج استخدم date() للتنسيق البسيط المكون من سطر واحد. واستخدم DateTime عندما تحتاج إلى حساب الفروق الزمنية بين التواريخ، أو إجراء عمليات تكرارية على نطاقات زمنية، أو تعديل التواريخ، أو مقارنتها.
س لماذا يختلف التوقيت لدي بمقدار 8 ساعات؟
ج بسبب المنطقة الزمنية. استدعِ date_default_timezone_set("Asia/Shanghai") في البرنامج النصي الخاص بك (أو اضبط date.timezone = Asia/Shanghai في php.ini).
س ماذا يُرجع strtotime("2026/02/29")؟
ج لا يوجد يوم 29 فبراير في عام 2026. يقوم strtotime بالتصحيح التلقائي ويُرجع 2026-03-01. ويتعامل DateTime مع هذا الأمر بنفس الطريقة.

📖 ملخص

📝 تمارين

  1. استخدم date() لعرض الوقت الحالي بثلاثة تنسيقات مختلفة: تنسيق التاريخ وفقًا لمعيار ISO (YYYY-MM-DD)، وتنسيق كامل يسهل قراءته ويشمل يوم الأسبوع، وتنسيق موجز بنظام الـ 24 ساعة.
  2. اكتب دالة getDaysBetween($date1, $date2) تستخدم الدالة DateTime لحساب عدد الأيام بين تاريخين.
  3. اكتب دالة isWeekend($date) تُرجع true إذا كان التاريخ المحدد يوافق يوم السبت أو الأحد.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%