php mysql : التعامل مع  التاريخ و الوقت

Unix Time Stamp

آخر تحيين: 10-01-2015

sql حقول التاريخ و الوقت دوال SQL


Unix Time Stamp : طريقة لاحتساب عدد الثواني التي مرّت منذ 1 يناير(كانون الثاني) 1970 إلى حدود تاريخ مُعيّن .
01-01-1970 : تاريخ ظهور نظام التشغيل المتعدد المهام Unix
مثلا : عدد الثواني التي مرّت منذ ذلك الحين إلى تاريخ كتابتي لهاته السّطور ، هو 1394723852 ثانية . يُمثّل هذا العدد ، الفترة المُمتدّة بين 01-01-1970 إلى 13-03-2014 . إذاً ، بعد تحويل هذا العدد إلى تاريخ/وقت ، سنحصل على شيء شبيه بهذا : 2014-03-13 15:17:32 .
في هذا الدّرس ، سنتعرّف على كيفية الحصول على عدد ثواني تاريخ ما ، و كيف نقوم بتحويل هذا العدد إلى تاريخ يمكن قراءته . ثم سنختم بمثال تطبيقي .

php time()

تُتيح لنا الدّالة time() ، الحصول على عدد الثواني التي مرّت منذ ظهور UNIX إلى وقتنا الحالي و الآني . و هي من دوال php الجاهزة . جرّبوا هذه الشيفرة على متصفّحكم :

<?php echo time(); ?>

ستحصلون على عدد من الثواني ، تمثّل تاريخ تجربتكم للشيفرة . لتحويله إلى تاريخ سهل القراءة سنلجأ إلى دالة أخرى من دوال php و هي : date()

php date()

تقوم الدّالة date() بتحويل تاريخ/وقت إلى تاريخ سهل القراءة .
الهيكل العام

date(format,timestamp)
  • format : طريقة عرض التاريخ . هذه القيمة إجبارية لتشغيل الدّالة
  • timestamp : التاريخ الذي نوَدّ عرضه . هذه القيمة ليست إجبارية . إذا لم نُحدّدها سيتم عرض التاريخ الحالي .

سأعطيكم فورا مثالا للإستئناس ، ثم سنرى طرق الإستعمال :

<?php echo date('Y-m-d'); ?>

يمكنكم تجربة هذه الشيفرة ، بما أننا لم نحدّد القيمة الثانية timestamp . قمنا باستخدام القيمة الأولى "format" فقط ، لهذا ستحصلون على التاريخ الحالي ، شيء شبيه بهذا : 2014-03-13 "طبعا ، ستحصلون على تاريخكم الحالي بدل هذا"
كيف حصلنا على هذا التاريخ ؟
حصلنا على هذا التاريخ المقروء ، بواسطة الحروف اللاتينية التي أضفناها كقيمة أولى للدّالة . هي بكل بساطة اختزال لِأسماء الأيام و الشهور و الأعوام ... سنرى بعضها . الشيء الوحيد الذي يجب أن تنتبهوا له ، هي طريقة كتابة الحروف ، هل هي من حجم كبير "Y" أو صغير "y" لأن طريقة العرض تختلف حسب الحجم .

date format
الرّمزالمعنىالمرادفطريقة العرض
ddayاليوميوم من الشهر من "01" إلى "31"
Ddayاليوميوم من الشهر من "1" إلى "31" بدون إضافة الرقم "0" إلى الأيام تحت 10 .
mmonthالشهرمن "01" إلى "12"
YYearالسنةعرض السنة بأربعة أرقام ، مثال :"2014"
yyearالسنةعرض السنة برقمين ، مثال :"14"
HHourالساعة24 ساعة من "00" إلى "23"
hhourالساعة12 ساعة من "01" إلى "12"
iminuteالدقيقةمن "00" إلى "59"
ssecondالثانيةمن "00" إلى "59"

مثال : لعرض الوقت الحالي كاملاً

<?php echo date('Y-m-d H:i:s');?>

لعرض وقت آخر غير الوقت الحالي ، سنيضفه كقيمة ثانية للدّالة date .
مثال لعرض تاريخ الأمس :

<?php 
 $last_day = time() - (24*60*60);
 echo 'الأمس : '.date('Y-m-d H:i:s', $last_day);
?>

لتحديد عدد ثواني تاريخ أمس . إستعملت الدالة time التي تعطينا الوقت الحالي ، ثم قمت بحذف يوم واحد بعد تحويله إلى عدد الثواني (أي 24 ساعة في 60 دقيقة في 60 ثانية ) .
توجد دوال php أخرى للتحكم في الوقت مثل mktime() و strtotime()، ربما نرى بعضها لاحقا في أمثلة سانحة . أمّا الآن ، سنُمرّ لإعطاء معنى لكل ما رأيناه . أي طريقة تخزين التاريخ و الوقت في قاعدة البيانات .
لهذا سنستعمل التمرين السابق "إنشاء صفحة الدّردشة " . سنقوم بتحسينه و ذلك بإضافة تاريخ التعليق أو الرّد .
أول شيء، يجب أن نضيف حقلا لجدولنا "chat" . لتخزين تواريخ الرّدود . و سنسمّيه مثلا : date_unix
إذا لم يكن لديكم جدول chat . يمكنكم إضافة هذا الحقل إلى أي جدول تريدونه ، و اتبعوا الطريقة لتخزين التاريخ و عرضه

إضافة حقل إلى الجدول

لإضافة حقل للجدول .إفتحوا صفحة phpMyAdmin . أنقروا على الأيقونة أمام إسم الجدول "chat" كما تبين الصورة أسفله :


في الصفحة أسفل هيكل الجدول ، لديكم استمارة تدعوكم لإضافة حقل :



الخانة الأولى (التي تمّ تبقيعها تلقائيا ) . ستضيف الحقل في آخر الجدول . أما الثانية إذا قمتم باختيارها ستضيف الحقل في أول الجدول . و الخانة الأخيرة تُتيح لكم تحديد مكان آخر للحقل .
أتركوا الخيارات كما هي ، سنضيف الحقل في آخر الجدول . ثم أنقروا على "GO" :
ثم قوموا بإنشاء الحقل بالمعطيات التالية :

NameTypeLength/Values
date_unixINT13

لاحظوا أننا استخدمنا نوع INT لأننا سنخزن عدد الثواني كما رأينا سابقا . إذاً ، فهو عبارة عن عدد، لهذا استعملنا هذا النوع .
قوموا بحفظ التعديلات و اتركوا phpMyAdmin جانبا .
افتحوا صفحة chat.php الصفحة التي تتضمن استمارة إضافة الرّدود و عرضها : سنقوم بتخزين التاريخ أثناء إضافة الرّد . للحصول عليه ، سنستخدم الدّالة time()

if(!empty($_POST['author']) AND !empty($_POST['content']))
 {
  $chat_time = time(); // عدد ثواني التاريخ و الوقت الحالي
  
  $author = $_POST['author'];
  $content = $_POST['content'];
  $query= $db->prepare('INSERT INTO chat (author, content, date_unix) VALUES
                        (:auth,:cont,:tps)
                      ');
  $query->bindValue(':auth',$author,PDO::PARAM_STR);
  $query->bindValue(':cont',$content,PDO::PARAM_STR);
  $query->bindValue(':tps',$chat_time,PDO::PARAM_INT);
  $query->execute();
  $query->CloseCursor();
}

لعرض التاريخ سنستخدم الدّالة date() :

foreach($chats as $chat) 
{
   $tari5 = (int)$chat['date_unix']; // الحصول على عدد الثواني من القاعدة

   $author = htmlspecialchars($chat['author']);
   $content = nl2br(htmlspecialchars($chat['content']));
   $id = (int)$chat['id'];
   // إضافة عرض تاريخ الرّد .
   echo '<p> <b>'.$author.' :</b> بتاريخ : '.date('Y-m-d الساعة H:i:s', $tari5).'
       <a href="edit.php?id='.$id.'"> تعديل </a> - 
       <a href="delete.php?id='.$id.'"> حذف </a> <br>
      '.$content.'</p>';
}

إحفظوا التعديلات . جميع الرّدود التي ستضيفونها من الآن فصاعداً ، ستتضمّن تاريخ كتابتها

الطريقة التي رأيناها للتعامل مع الوقت . طريقة سهلة ، إذ تتجلّى بساطتها في كون أننا نتعامل مع حقل عادي من نوع INT في قاعدة البيانات . ثم بواسطة دوال php نقوم بإجراء العمليات على قيم الحقل العددية لتحويلها و إعطائها معنى تاريخ/وقت . العيب الوحيد في هذه الطّريقة أنها ستتوقّف عن العمل بتاريخ 2038 ، بالنسبة لكل الأجهزة التي تستعمل نظام تشغيل مُكوّن من (32-bit). يبقى الحل هو تكييف الإستعمال الجديد للتاريخ أو الإنتقال إلى نظام تشغيل (64-bit) . في انتظار سنة 2038 . تبقى هذه الطريقة جد سلسة .

في الدّرس القادم ، سنتعرّف على الطريقة الثانية . و سنستخدم حقول التاريخ "date" بدل INT . و للتعامل معها سنلجأ لدوال SQL في أغلب الأحيان ، بدل دوال php التي رأيناها . مع قليل من التركيز ، ستصبح الأمور جد جد سهلة . و يمكنكم بذلك التعامل مع تواريخكم باحترافية و دون التوجس من سنة 2038