پروگرامنگ کرتے ہوئے بعض دفعہ کسی خاص وقت کا دورانیہ معلوم کرنے کی ضرورت پیش آتی ہے، مثال کے طور پر ایسے کام درج ذیل نوعیت کے ہو سکتے ہیں:
- ہم یہ جاننا چاہتے ہیں کہ کسی فائل کو بنے ہوئے کتنا عرصہ گزر چکا ہے، اس کی بنیاد پر ہم یہ فیصلہ کرتے ہیں کہ کیا یہ فائل نئی معلومات کے ساتھ نئے سرے سے بنائی جانی چاہیے یا پھر اس فائل کو ایسے ہی رہنے دیا جائے۔
- آپ کسی مقامی مسجد کی ویب سائیٹ پر نمازوں کے اوقات دکھا رہے ہیں، اس میں آپ یہ دکھانا چاہتے ہیں کہ اگلی نماز میں اتنا وقت باقی ہے۔
- کسی بس سروس کی ویب سائیٹ پر ہم یہ دکھانا چاہتے ہیں کہ فلاں اسٹاپ پر اگلی بس کا پہنچنا اتنی دیر میں متوقع ہے، وغیرہ۔
آئیں پہلے وقت کے مختلف اجزاء کی تقسیم دیکھ لیتے ہیں، اس سے ہمیں PHP استعمال کرتے ہوئے وقت میں اضافہ یا کمی کرنے میں آسانی ہوگی۔ اگر ہم سیکنڈز کو وقت کی بنیادی اکائی کے طور پر لیں تو:
1 منٹ میں 60 سیکنڈز
1 گھنٹے میں 3600 سیکنڈز
1 دن میں 86400 سیکنڈز
1 ہفتے میں 604800 سیکنڈز
1 مہینے میں 2592000 سیکنڈز (اگر تیس دن کا مہینہ ہو تو)
اور 1 سال میں 31536000 سیکنڈز ہوتے ہیں-
وقت میں کمی یا اضافہ کیسے کریں؟
اس مقصد کے لیے ہم دو طریقے استعمال کریں گے۔ پہلے طریقے میں ()time فنکشن، جبکہ دوسرے طریقے میں ()strtotime فنکشن کا استعمال کریں گے۔
1- وقت میں کمی یا اضافے کے لیے ()time فنکشن کا استعمال:
PHP میں ()time فنکشن ہے جو 1 جنوری 1970 سے لے کر اب تک گزرا ہوا وقت سیکنڈز کی صورت میں مہیا کرتا ہے۔ ان سیکنڈز کو ()date فنکشن کی مدد سے فارمیٹ کر کے پڑھنے کے قابل بنایا جاتا ہے۔
درج ذیل مثال میں کوڈ کی پہلی لائن پر ٹائم زون سیٹ کیا گیا ہے تاکہ وقت میں جو کمی بیشی کی جائے وہ پاکستانی وقت کے مطابق ہو۔ اس کے بعد کی دو لائنوں پر آپ دیکھ سکتے ہیں کہ آج کا وقت ()time فنکشن سے لے کر now$ ویری ایبل میں محفوظ کیا گیا ہے۔ پھر اس ویری ایبل کو ()date فنکشن کی مدد سے فارمیٹ کر کے دکھایا گیا ہے۔ اگلی سطروں پر دی گئی مثالوں میں موجودہ وقت سے ایک گھنٹہ، ایک دن، ایک مہینہ اور پھر ایک سال منفی کر کے گزرے ہوئے اوقات دکھائے گئے ہیں۔ آخری مثال میں بجائے مکمل سیکنڈز مہیا کرنے کے ہم نے اپنی آسانی کے لیے دن، گھنٹوں اور سیکنڈوں کو آپس میں ضرب دے کر کل سیکنڈز حاصل کیے ہیں۔
<?php
date_default_timezone_set('Asia/Karachi');
$now = time();
print date("D, d M, Y - h:i a", $now) . "<br>";
$hour_before = time() - 3600;
print date("D, d M, Y - h:i a", $hour_before) . "<br>";
$day_before = time() - 86400;
print date("D, d M, Y - h:i a", $day_before) . "<br>";
$month_before = time() - 2592000;
print date("D, d M, Y - h:i a", $month_before) . "<br>";
$year_before = time() - 31536000;
print date("D, d M, Y - h:i a", $year_before) . "<br>";
// 30-days * 24-hours * 60-minutes * 60-seconds
$next_month = time() + (30 * 24 * 60 * 60);
print date("D, d M, Y - h:i a", $next_month) . "<br>";
?>
اس کوڈ کا نتیجہ اس طرح سے آئے گا:
Fri, 02 Feb, 2018 - 06:23 pm Fri, 02 Feb, 2018 - 05:23 pm Thu, 01 Feb, 2018 - 06:23 pm Wed, 03 Jan, 2018 - 06:23 pm Thu, 02 Feb, 2017 - 06:23 pm Sun, 04 Mar, 2018 - 06:23 pm
2- وقت میں کمی یا اضافے کے لیے ()strtotime فنکشن کا استعمال:
PHP میں ()strtotime فنکشن دستیاب ہے۔ اس فنکشن کو اگر تاریخ اور وقت ایک خاص ترتیب کے ساتھ الفاظ کی صورت میں مہیا کیے جائیں تو یہ اس کے بدلے میں سیکنڈز مہیا کر دیتا ہے۔ ان سیکنڈز کو پھر ()date فنکشن کے ساتھ فارمیٹ کر کے پڑھنے کے قابل بنایا جا سکتا ہے۔ درج ذیل کوڈ میں دی گئی مثالوں سے اس کا استعمال واضح ہے۔ آخری دو مثالوں میں آپ دیکھ سکتے ہیں کہ ()strtotime فنکشن کو موجودہ وقت کی بجائے اپنی طرف سے بھی تاریخ اور وقت مہیا کیے جا سکتے ہیں۔ مثلاً آپ ڈیٹابیس سے تاریخ اور وقت حاصل کر کے ان میں کمی یا اضافہ کر سکتے ہیں۔
<?php
date_default_timezone_set('Asia/Karachi');
print "<br><br><b>Given date</b>:<br>";
$variable = strtotime("14 August 2015");
print date("d M, Y (l)", $variable);
print "<br><br><b>Given date and time</b>:<br>";
$variable = strtotime("14 August 2015 14:15:00");
print date("d M, Y - h:ia (l)", $variable);
print "<br><br><b>Date and time of now</b>:<br>";
$variable = strtotime("now");
print date("d M, Y - h:ia (l)", $variable);
print "<br><br><b>Add 5 hours</b>:<br>";
$variable = strtotime("+5 hours");
print date("d M, Y - h:ia (l)", $variable);
print "<br><br><b>Add 1 week</b>:<br>";
$variable = strtotime("+1 week");
print date("d M, Y - h:ia (l)", $variable);
print "<br><br><b>Add 1 week, 3 days, 7 hours and 5 seconds</b>:<br>";
$variable = strtotime("+1 week 3 days 7 hours 5 seconds");
print date("d M, Y - h:ia (l)", $variable);
print "<br><br><b>Next Monday</b>:<br>";
$variable = strtotime("next Monday");
print date("d M, Y - h:ia (l)", $variable);
print "<br><br><b>Last Sunday</b>:<br>";
$variable = strtotime("last Sunday");
print date("d M, Y - h:ia (l)", $variable);
print "<br><br><b>Subtract 1 month</b>:<br>";
$variable = strtotime("-1 month");
print date("d M, Y - h:ia (l)", $variable);
print "<br><br><b>Subtract from date and time</b>:<br>";
$db_datetime = strtotime("14 August 2015 14:15:00");
$variable = strtotime("-1 year", $db_datetime);
print date("d M, Y H:i:s (l)", $variable);
print "<br><br><b>Subtract from database date and time</b>:<br>";
$db_datetime = strtotime("2015-08-14 14:15:00");
$variable = strtotime("-2 year -4 months -13 days -8 hours -30 minute", $db_datetime);
print date("d M, Y H:i:s (l)", $variable);
?>
اس کوڈ کا نتیجہ یوں ظاہر ہوگا:
Given date: 14 Aug, 2015 (Friday) Given date and time: 14 Aug, 2015 - 02:15pm (Friday) Date and time of now: 02 Feb, 2018 - 06:26pm (Friday) Add 5 hours: 02 Feb, 2018 - 11:26pm (Friday) Add 1 week: 09 Feb, 2018 - 06:26pm (Friday) Add 1 week, 3 days, 7 hours and 5 seconds: 13 Feb, 2018 - 01:26am (Tuesday) Next Monday: 05 Feb, 2018 - 12:00am (Monday) Last Sunday: 28 Jan, 2018 - 12:00am (Sunday) Subtract 1 month: 02 Jan, 2018 - 06:26pm (Tuesday) Subtract from date and time: 14 Aug, 2014 14:15:00 (Thursday) Subtract from database date and time: 01 Apr, 2013 05:45:00 (Monday)
کسی خاص عرصے کا دورانیہ کیسے معلوم کریں؟
اس مقصد کے لیے بھی ہم دو طریقے استعمال کریں گے۔ پہلا طریقہ آسان ہے جبکہ دوسرا تھوڑا سا مشکل۔
1- عرصے کا دورانیہ معلوم کرنے کا آسان طریقہ:
PHP میں مہیا کیے گئے ()date_diff فنکشن کی مدد سے معلوم کیا جا سکتا ہے کہ ایک تاریخ اور وقت کا دوسری تاریخ اور وقت کے ساتھ کتنا فرق ہے۔ یہ فنکشن دو تاریخوں کے پیرامیٹرز لیتا ہے اور جواب میں ایک آبجیکٹ مہیا کرتا ہے جس کی پراپرٹیز میں ان دونوں تاریخوں کے درمیان فرق سال، مہینے، دن، گھنٹے، منٹ، اور سیکنڈ کی شکل میں موجود ہوتا ہے۔ درج ذیل کوڈ میں آپ دیکھ سکتے ہیں کہ پہلی مثال میں صرف دو تاریخوں کے درمیان فرق معلوم کیا گیا ہے۔ جبکہ دوسری مثال میں ایک تاریخ اور وقت سے دوسری تاریخ اور وقت کا فرق معلوم کیا گیا ہے۔
<?php
// Date only
$date1 = date_create("2018-01-15");
$date2 = date_create("2020-04-25");
$diff = date_diff($date1, $date2);
$days = $diff->d;
$months = $diff->m;
$years = $diff->y;
print "The difference between 15 January 2018 and 25 April 2020 is:<br>";
print "$years year(s), $months month(s), $days day(s)<br><br>";
// Date and time
$date1 = date_create("2018-01-15 12:20:12");
$date2 = date_create("2020-04-25 10:12:34");
$diff = date_diff($date1, $date2);
$days = $diff->d;
$months = $diff->m;
$years = $diff->y;
$hours = $diff->h;
$minutes = $diff->i;
$seconds = $diff->s;
echo "The difference between 15 January 2018 12:20:12 and 25 April 2020 10:12:34 is:<br>";
print "$years year(s), $months month(s), $days day(s), $hours hour(s), $minutes minute(s), $seconds second(s)";
?>
اس کوڈ کا نتیجہ اس طرح سے آئے گا:
The difference between 15 January 2018 and 25 April 2020 is: 2 year(s), 3 month(s), 10 day(s) The difference between 15 January 2018 12:20:12 and 25 April 2020 10:12:34 is: 2 year(s), 3 month(s), 9 day(s), 21 hour(s), 52 minute(s), 22 second(s)
2- عرصے کا دورانیہ معلوم کرنے کا مشکل طریقہ:
بالفرض اگر ہم یہ معلوم کرنا چاہتے ہیں کہ کسی فائل کو بنے ہوئے کتنا عرصہ گزر چکا ہے تو اس کے لیے ہم موجودہ وقت سے فائل کے بننے کا وقت منفی کریں گے، جس کا جواب ہمارے پاس سیکنڈز کی صورت میں ہوگا۔ پھر ان سیکنڈز کو ہم دن، گھنٹے اور سیکنڈ میں تبدیل کریں گے۔
درج ذیل کوڈ میں کامنٹس کی لائنوں کے ساتھ نمبر دیے گئے ہیں، ان نمبروں کے لحاظ سے کوڈ کی وضاحت دی جا رہی ہے۔
- file_name$ کے نام سے ایک ویری ایبل بنایا گیا ہے جس میں cachefile.txt کا پاتھ دیا گیا ہے۔ اس سے اگلی لائن پر If-statement کے ذریعہ یہ شرط رکھی گئی ہے کہ اگر یہ فائل موجود ہے تب بلاک کے اندر موجود کوڈ استعمال کیا جائے ورنہ نہیں۔
- ()time فنکشن سے موجودہ وقت سیکنڈز کی صورت میں لے کر current_time$ ویری ایبل میں محفوظ کیا گیا ہے۔ پھر ()filemtime فنکشن کی مدد سے file_time$ ویری ایبل میں وہ وقت محفوظ کیا گیا ہے جب یہ فائل بنی تھی۔ پھر seconds_since_modified$ ویری ایبل میں فائل بننے سے لے کر اب تک کا وقت سیکنڈز کی صورت میں محفوظ کیا گیا ہے۔
- فائل کے سیکنڈز کو دن کے سیکنڈز پر تقسیم کر کے جو ویلیو حاصل ہوئی ہے اسے ہم نے ()floor فنکشن کے حوالے کیا ہے۔ ()floor فنکشن یہ کرتا ہے کہ اگر اسے مہیا کی گئی ویلیو اعشاریے (Decimal) میں ہے تو یہ اعشاریے کے بعد والا حصہ ختم کر کے صرف Integer مہیا کر دیتا ہے۔ مثلاً اس فنکشن کو 2.3 کی ویلیو دی جائے یا 2.7 کی، یہ فنکشن دونوں کو 2 میں بدل دے گا۔ اس طرح ہم نے سیکنڈز میں سے دنوں کی تعداد حاصل کی ہے۔
- فائل کے سیکنڈز کو Modulus Operator کی مدد سے دنوں کے سیکنڈز پر تقسیم کیا گیا ہے جس سے ہمارے پاس باقی (Remainder) سیکنڈز آگئے ہیں۔ ان باقی بچنے والے سیکنڈز کو اگلی لائن میں گھنٹوں کے سیکنڈز میں تبدیل کیا گیا ہے جس سے ہم نے گھنٹوں کی تعداد حاصل کر لی ہے۔
- یہاں بھی منٹ حاصل کرنے کے لیے وہی کام کیا گیا ہے جو پچھلے مرحلے میں کیا گیا تھا، اب ہمارے پاس منٹ بھی موجود ہیں۔
- سیکنڈز کی تعداد حاصل کی گئی ہے لیکن ()floor فنکشن کی بجائے ()ceil فنکشن استعمال کیا گیا ہے۔ ()ceil فنکشن بھی اعشاریے کے بعد والا حصہ حذف کر دیتا ہے لیکن اس طرح سے کہ 2.3 اور 2.7 دونوں کو یہ فنکشن 3 میں تبدیل کر دے گا۔ اس طرح ہمارے پاس سیکنڈز بھی موجود ہیں۔
- آخر میں دن، گھنٹے اور سیکنڈز کی جو ویلیوز ہم نے حاصل کی ہیں انہیں print اسٹیٹمنٹ کی مدد سے دکھا دیا گیا ہے۔
<?php
// 1. File path
$file_name = 'cachefile.txt';
if (file_exists($file_name)) {
// 2. Seconds since file was modified
$current_time = time();
$file_time = filemtime($file_name);
$seconds_since_modified = $current_time - $file_time;
// 3. Days
$days = floor($seconds_since_modified / 86400);
// 4. Hours
$hour_seconds = $seconds_since_modified % 86400;
$hours = floor($hour_seconds / 3600);
// 5. Minutes
$minute_seconds = $hour_seconds % 3600;
$minutes = floor($minute_seconds / 60);
// 6. Seconds
$seconds = $minute_seconds % 60;
$seconds = ceil($seconds);
print "$days days $hours hours $minutes minutes and $seconds seconds";
} else {
print "<div style='color:red;'>The file '" . $file_name . "' does not exist.</div>";
}
?>
اس کا نتیجہ کچھ اس طرح سے آئے گا:
3 days 0 hours 51 minutes and 32 seconds
ایک بات نوٹ کرنے کی ہے کہ ایپلی کیشن کی تیاری کے وقت ایسے کوڈ کا فنکشن تیار کر لیا جاتا ہے، تاکہ جہاں ضرورت پڑے وہاں یہ مکمل کوڈ نہ لکھنا پڑے۔
Modified: Wed, 05/02/2018 - 22:50