إشترك معنا ليصلك جديد الموقع

بريدك الإلكترونى فى أمان معنا

الأحد، 1 مارس 2015

البرمجة بلغة php : التعامل مع الوقت والتاريخ في لغة PHP

البرمجة بلغة php : التعامل مع الوقت والتاريخ

ان للوقت و التاريخ اهمية كبيرة  جدا و خصوصا في عالم الويب (تاريخ إضاافة مقال , تعليق أو آخر تحديث للموقع ...)
 , وبالتاكيد تُوفر لغة php  امكانية الحصول على الوقت والتاريخ .
و للحصول على الوقت أو التاريخ في php  نستخدم الدالة date التي تُعيد الوقت أو التاريخ على شكل سلسلة نصية string
 حسب التنسيق المُمرر اليها :
date($format, $timestamp);

الوسيط الول المُمرر اليها هو عبارة  عن نص يحوي التنسيق المُراد اظهار التاريخ أو الوقت به , أما الثاني هو وسيط اختياري الذي يمثل بصمة الوقت (سيتم التطرق الى بصمات الوقت لحقا ).
 جدول التنسيقات التي يمكن استخدامها مع دوال الوقت والتاريخ في  php :

 الحرف d :
يُعيد رقم اليوم من الشهر , وتتراوح قيمته بين 1 - 01 وللحصول على رقم اليوم بدون اصفار استخدم التنسيق j .

الحرف m :
يُعيد رقم الشهر , وتتراوح قيمته بين  12 - 01
وللحصول على رقم الشهر بدون اصفار  استخدم التنسيق n

الحرف W :
يُستخدم للحصول على رقم اليوم من الاسبوع , وتتراوح قيمته بين 0 (الاحد) و 6 (السبت)

الحرف h :
يُستخدم للحصول على الساعة الحالية لكن بنظام 12 ساعة .

الحرف H :
يُستخدم للحصول على الساعة الحالية لكن بنظام 24 ساعة .

الحرف i :
يُعيد الدقائق الحالية .

الحرف s :
يُعيد الثواني الحالية .

الحرف Y :
يُعيد رقم السنة الحالية بشكل اربعة ارقام .


القائمة تطول لكن هذه هي اشهر دللت الحرف و بالطبع يمكنك العودة  الى php.net للاطلاع على القائمة كاملة , مثال عن استخدام الدالة date :
<?php
echo date('H : i : s');
?>

يقوم المثال السابق بإظهار الوقت الحالي على الشكل 09 : 04 : 11

مثال اخر :
<?php
echo date('Y / m / d');

?>

يُعيد المثال السابق التاريخ الحالي على الشكل . YYYY / MM / DD

طريقة طباعة التاريخ باللغة العربية :

كما ذكرنا سابقا يلزم ذكر الوقت والتاريخ عند كتابة المقالت او التعليقات , ولظهار التاريخ باللغة

العربية سنستخدم عدة  دوال :

الدالة الولى تحويل رقم الشهر الى اسمه : أي عندما يكون الشهر الخامس مثل يكون اسمه أيار

أو مايو (لربما تختلف مسميات الشهر من بلد الى آخر) , وتكون على الشكل التالي :
<?php
header('Content-Type: text/html; charset=UTF-8');
function month_name()

{
$monthes = array(
,'كانون الثاني' <= 1
,'شباط' <= 2
,'اذار' <= 3
,'نيسان' <= 4
,'أيار' <= 5
,'حزيران' <= 6
,'تموز' <= 7
,'اب' <= 8
,'أيلول' <= 9
,'تشرين الول' <= 10
,'تشرين الثاني' <= 11
'كانون الول' <= 12
);
return $monthes[date('n')];
}
echo month_name();
?>

حيث انشئنا مصفوفة كل مفتاح أو مُعرف كل عنصر مرتبط مع اسم الشهر و باستخدام التنسيق n حصلنا على رقم الشهر . 
الدالة الثانية اظهار اسماء ايام السبوع : اي على الشكل (الجمعة , السبت ...) :

<?php
header('Content-Type: text/html; charset=UTF-8');
function day_name()
{
$days = array(' ;('الاحد', 'الثنين', 'الثلثاء', 'الربعاء', 'الخميس', 'الجمعة', 'السبت
return $days[date('w')];
}
echo day_name();
?>

الان لنجمع الكواد مع بعضها :
<?php
header('Content-Type: text/html; charset=UTF-8');
printf('%s - %s - %d:%d %d', day_name(), month_name(), date('H'),
date('i'), date('Y'));
function month_name()
{
$monthes = array(
,'كانون الثاني' <= 1
,'شباط' <= 2
,'اذار' <= 3
,'نيسان' <= 4
,'ايار' <= 5
,'حزيران' <= 6
,'تموز' <= 7
,'اب' <= 8
,'ايلول' <= 9
,'تشرين الول' <= 10
,'تشرين الثاني' <= 11
'كانون الول' <= 12
);
return $monthes[date('n')];
}
function day_name()
{
$days = array(' ;('الحد', 'الثنين', 'الثلثاء', 'الربعاء', 'الخميس', 'الجمعة', 'السبت
return $days[date('w')];
}
?>
المثال السابق سيطبع الوقت بالطريقة التالية : الجمعة - ايار - 16:23 - 2013 .

بصمة الوقت لنظام اليونكس (The unix timestamp) :

باختصار هو عدد الثواني منذ منتصف ليلة رأس السنة عام 1970 , ولتوليد هذه البصمة استخدم الدالة time 
التي تُعيد الوقت الحالي , أما اذا اردت ان تحصل على بصمة الوقت لاي تاريخ تريد استخدم الدالة mktime حسب الشكل التالي :
mktime($hour, $minute, $second, $month, $day, $year);

امثلة عن استخدام الدالتين السابقتين :
<?php
echo date("m-d-Y H:i", time());
echo '<br>';
echo date("m-d-Y H:i", mktime(14, 23, 11, 11, 6, 2009));
?>

الدالة  getdate :
تُعيد هذه الدالة التاريخ والوقت على شكل مصفوفة , وتقبل وسيطا واحدا اختياريا هو بصمة الوقت :
<?php
$timestamp = mktime(14, 23, 11, 11, 6, 2009);
$date = getdate($timestamp);
print_r($date);
/*
Array
(
[seconds] => 11
[minutes] => 23
[hours] => 14
[mday] => 6
[wday] => 5
[mon] => 11
[year] => 2009
[yday] => 309
[weekday] => Friday
[month] => November
[0] => 1257513791
)
*/
?>
الحصول على الوقت بتوقيت غرينتش :
كما لحظت سابقا , إن لغة php تقوم بحساب الوقت والتاريخ وفق وقت وتاريخ السيرفر المُستضيف , أي بمعنى آخر عندما تستخدم الدالة date  في برنامج مُستضاف على سيرفر في السعودية فإن النتائج تختلف عن استخدام نفس الدالة وفي نفس الوقت على سيرفر موجود في المغرب مثلا , ولهذا يُفضل الحصول على الوقت بتوقيت غرينتش ومن ثم تحويلها الى المنطقة المطلوبة :

<?php
echo gmdate("m-d-Y H:i", time() + 2 * 3600);
?>
لقد اضافنا في المثال السابق ساعتين من الزمن للحصول على الوقت في سوريا مثل على اي سيرفر تم اعداد الوقت والتاريخ فيه بشكل صحيح .

الدالة microtime  :

تُعيد الدالة السابقة بصمة الوقت الحالية لكنها مقدرة  بالملي ثانية ول تقبل هذه الدالة أي وسائط .
حساب العمر عن طريق تاريخ الميلد : في بعض الحيان يُطلب من المستخدم ان يُدخل تاريخ ميلده عند التسجيل في الموقع , ولحساب عمر المستخدم , يوجد عدد من الطرق اسهلها - لكنها غير دقيقة - هي انقاص بصمة وقت ميلد المستخدم (عن طريق استخدام الدالة mktime التي سبق شرحها) من بصمة الوقت الحالية , ومن ثم توليد رقم السنة عن طريق الدالة date التي يمرر
لها التنسيق Y ومن ثم انقاص 1970 (لن بصمة الوقت تبدأ من عام 1970 ) من الناتج كما يلي : 

<?php
$time = time() - mktime(0, 0, 0, 5, 21, 1995);
echo date("Y", $time) - 1970;
?>


أو يمكن قسمة فرق الوقت على ( 60 * 60 * 24 * 365 ) اي سنة كاملة مقدرة  بالثواني :

<?php
$time = time() - mktime(0, 0, 0, 5, 21, 1995);
echo floor($time / (60 * 60 * 24 * 365));
//echo floor(time() - mktime(0, 0, 0, 5, 21, 1995) / (31536000));
?>

تم استخدام الدالة floor لتقريب الرقم الى اقرب قيمة دنيا .

ملاحظة: 
 يفضل حفظ الوقت في قواعد البيانات - أو أي وسيلة حفظ - على شكل timestamp  في حقل عدد صحيح Int وليس على شكل date  لسهولة إستخراج الوقت والتاريخ الذي تريده بسهولة وإجراء العمليات عليه .

وكأحد التطبقات نلحظ في بعض المواقع يتم عرض الزمن المنقضي لنشر موضاوع - أو تعليق أو
شئ أخر - بالشكل التالي "منذ 3 أيام , منذ 1 ساعة , منذ 3 أسابيع , منذ 5 شهور , منذ 2 سنة
وهكذا ..."

إتفقنا أننا سنقوم بتخزين الوقت على شكل timestamps وإل ستقوم بإستخدام دالة mktime لتحويل التاريخ إلى بصمة الوقت
الفكرة  هي أننا سنقوم بطرح قيمة بصمة الوقت لتاريخ النشر -أو الضاافة أو أي شيئ- من الوقت الحالي بإستخدام دالة time وناتج الطرح بعملية قسمة بسيطة نستطيع إستخراج كم "ثانية,دقيقية,ساعة,يوم,اسبوع,شهر, سنة" مضت منذ ذلك الوقت
 والكود التالي يقوم بتنفيذ ما سبق :

<?php
$arr = array( 's'=>'Second',
'i'=>'Minute',
'h'=>'Hour',
'd'=>'Day',
'w'=>'Week',
'm'=>'Month',
'y'=>'Year',
);
$retArr = getElapsedTime(mkTime(0,0,0,'2','1','2013'));
echo $retArr[1].' '.$arr[$retArr[0]];
function getElapsedTime($t)
{
$timeDiff = time()-$t;
if($timeDiff < 60)
{
$arr[0] = 's';
$arr[1] = $timeDiff;
}
else if(($temp=(int)($timeDiff/60)) < 60)
{
$arr[0] = 'i';
$arr[1] = $temp;
}
else if(($temp=(int)($timeDiff/(60*60))) < 24)
{
$arr[0] = 'h';
$arr[1] = $temp;
}
else if(($temp=(int)($timeDiff/(60*60*24))) < 7)
{
$arr[0] = 'd';
$arr[1] = $temp;
}
else if(($temp=(int)($timeDiff/(60*60*24*7))) < 4)
{
$arr[0] = 'w';
$arr[1] = $temp;
}
else if(($temp=(int)($timeDiff/(60*60*24*7*4))) < 12)
{
$arr[0] = 'm';
$arr[1] = $temp;
}
else
{
$arr[0] = 'y';
$arr[1] = $temp;
}
return $arr;
}
?>

الكود واضاح تقريباً العملية ما هي إل قسمة لستخراج اليام أو الشهور ... 

ملحظة : يمكن إسناد قيم لمتغيرات في الشروط فتتم السناد والمقارنة معاً كما هو الحال مع المتغير temp $

إذا أردنا إستخدام الكود السابق مع اللغة العربية فنحن نعلم أن المعدود يختلف على حسب
العداد فالعداد 1 و 2 يطابقا المعدود في التذكير والتأنيث ومن 3 إلى 9 يخالف العدد المعدود
تذكيراً وتأنياً

والعدد 10 يتبع حكم العداد من 3:9 إذا كان مفرداً واذا جاء مركب يتبع حكم العداد 1 و 2
إلخ ...

إذا أردنا إستخدام الكود السابق مع اللغة العربية فنحن نعلم أن المعدود يختلف على حسب
العداد فالعداد 1 و 2 يطابقا المعدود في التذكير والتأنيث ومن 3 إلى 9 يخالف العدد المعدود
تذكيراً وتأنياً
والعدد 10 يتبع حكم العداد من 3:9 إذا كان مفرداً وغذا جاء مركب يتبع حكم العداد 1 و 2
إلخ ...
عموماً لن نحتاج كثيراً من هذا القواعد هنا لننا لن نستخدم التفقيط مع الرقام ولكن
سنستخدمها بصورتها الرقمية فسيتبع الرقم 1 و 2 والعداد ما زاد عن 10 الفراد كالتالي :
1 ثانية , 2 ثانية , 11 ثانية , 2 دقيقة , 20 دقيقة , 2 سنة , 100 سنة , 1 اسبوع , 2 اسبوع , 2 شهر ,
12 شهر , 1 يوم , 30 يوم
- والعداد من 3 إلى 9 يكون المعدود جمع كالتالي : 3 ثوان , 9 ثوان , 5 دقائق , 9 ساعات , 3
اسابيع , 4 شهور , 5 سنوات أو سنين .
وعلى هذا سيكون الكود على النحو التالي :

<!DOCTYPE html>
<html dir="rtl">
<head>
<meta charset="utf-8"/>
</head>
<body>
<?php
$arr = array( 's'=>' ,'ثانية
'S'=>' ,'ثوان
'i'=>' ,'دقيقة
'I'=>' ,'دقائق
'h'=>' ,'ساعة
'H'=>' ,'ساعات
'd'=>' ,'يوم
'D'=>' ,'أيام
'w'=>' ,'أسبوع
'W'=>' ,'أسابيع
'm'=>' ,'شهر
'M'=>' ,'شهور
'y'=>' ,'سنة
'Y'=>' 'سنوات
);
$retArr = getElapsedTime(mkTime(0,0,0,'2','1','2013'));
echo $retArr[1].' '.$arr[$retArr[0]];
function getElapsedTime ($t)
{
$timeDiff = time()-$t;
if($timeDiff < 60)
{
if($timeDiff<1)
{
$arr[] = 's';
$arr[] = '0';
}

else if($timeDiff<3 or $timeDiff>10)
{
$arr[] = 's';
$arr[] = $timeDiff;
}
else
{
$arr[] = 'S';
$arr[] = $timeDiff;
}
}
else if(($temp=(int)($timeDiff/60)) < 60)
{
if($temp<3 or $temp>10)
{
$arr[] = 'i';
}
else
{
$arr[] = 'I';
}
$arr[] = $temp;
}
else if(($temp=(int)($timeDiff/(60*60))) < 24)
{
if($temp<3 or $temp>10)
{
$arr[] = 'h';
}
else
{
$arr[] = 'H';
}
$arr[] = $temp;
}
else if(($temp=(int)($timeDiff/(60*60*24))) < 7)
{
if($temp<3)
{
$arr[] = 'd';
}
else
{
$arr[] = 'D';
}
$arr[] = $temp;
}
else if(($temp=(int)($timeDiff/(60*60*24*7))) < 4)
{
if($temp<3)
{
$arr[] = 'w';
}
else
{
$arr[] = 'W';
}
$arr[] = $temp;

}
else if(($temp=(int)($timeDiff/(60*60*24*7*4))) < 12)
{
if($temp<3 or $temp>10)
{
$arr[] = 'm';
}
else
{
$arr[] = 'M';
}
$arr[] = $temp;
}
else
{
$temp = (int)($timeDiff/(60*60*24*30*12));
if($temp<3 or $temp>10)
{
$arr[] = 'y';
}
else
{
$arr[] = 'Y';
}
$arr[] = $temp;
}
return $arr;
}
?>
</body>
</html>

في المثال السابق استخدمت الحروف الصغيرة  والكبيرة  للتفرقة بين مدى الرقام فالحرف
الصغير يدل على أن العدد إما 1 أو 2 أو أكبر من 10 والحرف الكبير ما دون ذلك .
طبعاً بإضاافة بعض التغييرات البسيطة على الدالة لتمكننا من طباعة ما نشاء كالدقائق والثوان
معاً أو اليام والساعات أي شيئ كيفما تشاء .

ملحظة : من الصدار 5.1.0 فما فوق أصبح مدى ال timestamps من 13 ديسمبر 1901 الساعة 20:45:54 GMT إلى 19 يناير 2038 الساعة 03:14:07 GMT وهو أقصى مدى للمتغير من النوع الصحيح int من النوع signed في أنظمة 32bit .

وللحصول على تاريخ أقل من سنة 1970 سندخل قيمة سالبة للدالة date ولمعرفة الtimestamps لتاريخ قبل 1970 أيضاً سنستخدم  mktime وستعطينا قيمة ولكن بإشارة  سالبة إذا تم تمرير هذه القيمة للدالة date ستحصل على التاريخ .

فيصبح كود معرفة السن من خلل تاريخ الميلد كالتالي :

<?php
echo age(mktime(0,0,0,'12','5','1960'));
function age($in)
{
if($in<0)
{
$in = (-1*$in)+time();
}
else
{
$in = time()-$in;
}
return (int)($in/(365.25*24*60*60));
}
?> 


المصدر:
كتاب: تعلم البرمجة بلغة php - الطبعة الثانية - 2013 
للمؤلفان : عبد اللطيف ايمش و أحمد ابو السعود

يسمح لك بنسخ وتوزيع أو تعديل هذا المقال وفق شروط اتفاقية رخصة غنو للمستندات الحرة  الاصدار 1.2 GNU FDL
أو اي إصدار لاحق يتم نشره من قبل مؤسسة البرمجيات الحرة .


شارك هذه الصفحة وتابعنا على صفحاتنا الرسمية
شارك الموضوع →
تابعنا →
إنشر الموضوع →

0 التعليقات:

إرسال تعليق

افلام اون لاين