قالب‌ بندی تاریخ و زمان جاری در PHP — از صفر تا صد

۴۳۳ بازدید
آخرین به‌روزرسانی: ۰۸ مهر ۱۴۰۲
زمان مطالعه: ۸ دقیقه
قالب‌ بندی تاریخ و زمان جاری در PHP — از صفر تا صد

هنگام کار با وب‌سایت‌ها در اغلب موارد با تاریخ و زمان سروکار داریم. برای نمونه ممکن است بخواهید آخرین تاریخ ویرایش یک نوشته را نمایش دهید، یا به مدت زمانی که از درج نظر یک کاربر می‌گذرد اشاره کنید. همچنین ممکن است بخواهید تعداد روزهایی که به یک رویداد مانده است را به صورت معکوس نمایش دهید. خوشبختانه PHP برخی تابع‌های داخلی تاریخ و زمان دارد که به ما کمک می‌کند تا همه این کارها را به روشی ساده‌تر انجام دهیم.

در این راهنما روش قالب‌بندی تاریخ و زمان جاری را در زبان برنامه‌نویسی PHP به شما آموزش می‌دهیم. همچنین در این نوشته خواهید آموخت که چگونه از یک رشته متنی تاریخ، مقدار زمان را استخراج کنید و این که چگونه تاریخ‌ها را به هم اضافه یا از هم کسر کنید.

دریافت تاریخ و زمان در قالب رشته متنی

تابع (date($format, $timestamp یکی از پراستفاده‌ترین توابع تاریخ و زمان در PHP است. این تابع قالب مطلوب خروجی برای تاریخ را به عنوان آرگومان اول می‌گیرد و یک عدد صحیح به عنوان مقدار زمان بازمی‌گرداند که باید به قالب تاریخ مفروض تبدیل شود. پارامتر دوم این تابع اختیاری است و خالی گذاشتن آن باعث می‌شود که تاریخ و زمان کنونی بر اساس قالبی که در مقدار format$ تعریف می‌شود در خروجی ارائه شود.

پارامتر format$ یک سری از کاراکترها به عنوان مقادیر معتبر می‌پذیرد. برخی از این کاراکترها معانی سرراستی دارند: Y بازنمایی عددی کاملی از سال با 4 رقم ارائه می‌دهد (2018) و y آخرین دو رقم سال جاری (y) را نمایش می‌دهد. به طور مشابه H ساعت را در قالب 24 ساعتی و با صفر ابتدایی نمایش می‌دهد. اما h ساعت را در قالب 12 ساعتی با صفر ابتدایی ارائه می‌کند.

در ادامه برخی از کاراکترهای رایج قالب تاریخ و زمان و مقادیرشان ارائه شده است.

کاراکترمعنانمونه
dروزِ ماه با صفر ابتدایی03 یا 17
jروزِ ماه بدون صفر ابتدایی3 یا 17
Dروزِ هفته به صورت اختصار سه‌حرفیMon
lروزِ هفته به صورت کاملMonday
mماه به صورت عددی با صفر ابتدایی09 یا 12
nماه به صورت عددی بدون صفر ابتدایی9 یا 12
Mماه به صورت اختصار سه‌حرفیSep
Fنام کامل ماهSeptember
yسالِ دو رقمی18
Yسالِ کامل2018

البته کاراکترهای زیاد دیگری برای توصیف خروجی تابع ()date وجود دارند. برای اطلاعات بیشتر به «جدول کاراکترهای قالب‌بندی» مراجعه کنید.

در ادامه برخی نمونه‌های عملی از تابع ()date را می‌بینیم. می‌توانیم از این تابع برای به دست آوردن سال جاری، ماه جاری، ساعت جاری و موارد دیگر استفاده کنیم. حتی می‌توانیم یک رشته تاریخ کامل به دست آوریم.

<?php
 
// Output — 2018
echo date('Y');
 
// Output — September 2018
echo date('F Y');
 
// Output — 13 September, 2018
echo date('d F, Y');
 
// Output — 13 September, 2018 (Thursday)
echo date('d F, Y (l)');
<br>

همچنین از تابع ()date می‌توان برای ارائه مقدار زمان در خروجی استفاده کرد. در ادامه برخی از کاراکترهای قالب‌بندی زمان که بیشتر مورد استفاده قرار می‌گیرند را ارائه کرده‌ایم:

کاراکترمعنانمونه
gساعت در قالب 12 ساعتی با صفر ابتدایی1 یا 12
hساعت در قالب 12 ساعتی بدون صفر ابتدایی01 یا 12
Gساعت در قالب 24 ساعتی بدون صفر ابتدایی1 یا 13
Hساعت در قالب 24 ساعتی با صفر ابتدایی01 یا 13
aam/pm به صورت حروف کوچکam
Aam/pm به صورت حروف بزرگAM
iدقیقه با صفر ابتدایی09 یا 15
sثانیه با صفر ابتدایی05 یا 30

در ادامه مثال‌هایی از رشته‌های زمانی که قالب‌بندی شده‌اند نمایش یافته است:

// Output — 11:03:37 AM
echo date('h:i:s A');
 
// Output — Thursday, 11:04:09 AM
echo date('l, h:i:s A');
 
// Output — 13 September 2018, 11:05:00 AM
echo date('d F Y, h:i:s A');
 
?>

لازم به ذکر است که اگر می‌خواهید از این کاراکترها درون رشته تاریخ استفاده کنید باید آن‌ها را escape کنید، یعنی درون ‘ ’ بیاورید.

<?php
 
// Output — CEST201813am18 1115 Thursday.
echo date('Today is l.');
 
// Output — Today is Thursday.
echo date('\T\o\d\a\y \i\s l.');
 
// Output — Today is Thursday.
echo 'Today is '.date('l.');
 
?>

دریافت برچسب زمانی یونیکس

برخی اوقات در PHP لازم است که مقدار زمان جاری را در قالب برچسب زمانی (timestamp) یونیکس داشته باشیم. این کار به کمک تابع ()time بسیار آسان است. این تابع یک عدد صحیح بازمی‌گرداند که تعداد میلی‌ثانیه‌های سپری شده از نیمه‌شب (00:00:00 GMT) تاریخ 1 ژانویه 1970 را نشان می‌دهد.

از این تابع برای حرکت رو به جلو و عقب در زمان نیز می‌توان استفاده کرد. بدین منظور تنها کاری که باید انجام داد این است که عدد صحیح ثانیه‌های زمان جاری را از تابع ()time دریافت کرده و سپس مقدار نهایی را به رشته تاریخ مطلوب تبدیل نمود. در ادامه دو مثال ارائه شده است:

<?php
 
// Output — CEST201813am18 1115 Thursday.
echo date('Today is l.');
 
// Output — Today is Thursday.
echo date('\T\o\d\a\y \i\s l.');
 
// Output — Today is Thursday.
echo 'Today is '.date('l.');
 
?>

نکته مهمی که باید به خاطر داشته باشید، این است که مقدار برچسب زمانی که تابع ()time بازمی‌گرداند در برابر مناطق زمانی مختلف تغییر نمی‌یابد و صرفاً تعداد ثانیه‌های سپری شده از نیمه‌شب 1 ژانویه 1970 به وقت گرینویچ را محاسبه می‌کند. این بدان معنی است که در نقطه مشخصی از زمان، این تابع مقدار یکسانی را در ایالات متحده، اروپا، هند و ژاپن بازمی‌گرداند.

روش دیگر برای دریافت برچسب زمان در یک تاریخ معین استفاده از تابع (mktime($hour, $minute, $second, $month, $day, $year است. زمانی که همه پارامترها خالی باشند، این تابع تنها از تاریخ و زمان محلی کنونی برای محاسبه مقدار زمان استفاده می‌کند. این تابع را می‌توان به همراه ()date برای ایجاد رشته‌های مورد نظر تاریخ و زمان استفاده کرد.

<?php
 
// Output — CEST201813am18 1115 Thursday.
echo date('Today is l.');
 
// Output — Today is Thursday.
echo date('\T\o\d\a\y \i\s l.');
 
// Output — Today is Thursday.
echo 'Today is '.date('l.');
 
?>

به طور کلی ()time برای حرکت به جلو عقب در زمان مفید است؛ در حالی که ()mktime در مواردی مفید است که می‌خواهید به نقطه مشخصی در زمان بروید.

تبدیل یک رشته تاریخ-زمان به یک برچسب زمان

تابع ([()strtotime($time, [$now = time زمانی که می‌خواهید مقادیر تاریخ و زمان متفاوت را که در قالب یک رشته است به یک برچسب زمانی تبدیل کنید، به طرز خارق‌العاده‌ای مفید خواهد بود. این تابع می‌تواند تقریباً همه رشته‌های تاریخ-زمان را به صورت برچسب زمانی تجزیه کند.

برای استفاده از این تابع بهتر است ابتدا قالب‌های زمان، تاریخ، تاریخ-زمان ترکیبی و تاریخ-زمان نسبی معتبر را بررسی کنید.

این تابع با بررسی قالب‌های تاریخ-زمان نسبی می‌تواند به سادگی رشته‌هایی که غالباً مورد استفاده قرار می‌گیرند را به مقادیر برچسب زمانی‌شان تبدیل کند. در مثال زیر برخی روش‌های این تبدیل ارائه شده‌اند:

<?php
 
$some_time = strtotime("10 months 15 days 10 hours ago");
// Output — It was Sunday on 29 October, 2017 03:16:46.
echo 'It was '.date('l', $some_time).' on '.date('d F, Y h:i:s', $some_time).'.';
 
$some_time = strtotime("next month");
// Output — It is Saturday on 13 October, 2018 01:18:05.
echo 'It is '.date('l', $some_time).' on '.date('d F, Y h:i:s', $some_time).'.';
 
$some_time = strtotime("third monday");
// Output — Date on the third monday from now will be 01 October, 2018.
echo 'Date on the third monday from now will be '.date('d F, Y', $some_time).'.';
 
$some_time = strtotime("last day of November 2021");
// Output — Last day of November 2021 will be Tuesday.
echo 'Last day of November 2021 will be '.date('l', $some_time).'.';
 
?>

افزودن، تفریق و مقایسه تاریخ‌ها

امکان جمع کردن و تفریق دوره‌های زمانی خاص با یا از یک تاریخ وجود دارد. این کار از طریق توابع ()date_add و ()date_sub میسر است. همچنین می‌توانید از تابع ()date_diff برای کسر کردن دو تاریخ از هم و ارائه تفاضل آن دو در خروجی بر حسب سال، ماه، روز یا هر چیز دیگری استفاده کنید.

به طور کلی بهتر است چنین محاسبات مرتبط با تاریخ و زمانی را به سبک شیءگرا و در کلاس DateTime انجام دهید، تا این که بخواهید آن را به صورت رویه‌ای اجرا کنید. ما در ادامه نمونه‌هایی از هر دو روش را ارائه کرده‌ایم و شما می‌توانید هر کدام را که ترجیح می‌دهید انتخاب کنید.

<?php
 
$present = date_create('now');
$future = date_create('last day of January 2024');
$interval = date_diff($present, $future);
// Output — 05 years, 04 months and 17 days
echo $interval->format('%Y years, %M months and %d days');
 
$present = new DateTime('now');
$future = new DateTime('last day of January 2024');
$interval = $present->diff($future);
// Output — 05 years, 04 months and 17 days
echo $interval->format('%Y years, %M months and %d days');
 
?>

زمانی که از ()DateTime::diff استفاده می‌کنید؛ شیء DateTime یک متد ()diff روی آن فراخوانی می‌شود از شیء DateTime-ی که به متد )(Diff ارسال می‌شود کم می‌شود. اما وقتی کدهایی به سبک رویه‌ای می‌نویسید، پارامتر تاریخ نخست از پارامتر تاریخ دوم کسر می‌شود.

هر دو تابع و متد یک شیء ()DateInterval بازمی‌گردانند که نشان دهنده تفاضل دو تاریخ است. این بازه را می‌توان با استفاده از یک خروجی خاص به وسیله همه کاراکترهایی که در مستندات متد ()format بیان شده است قالب‌بندی نمود.

تفاضل بین سبک شیءگرا و سبک رویه‌ای زمانی که در حال جمع یا تفریق یک بازه زمانی هستیم بیشتر هویدا می‌شود.

در روش شیءگرا می‌توانید یک شیء DateTime را با استفاده از سازنده ()DateTime مقداردهی اولیه بکنید. به طور مشابه می‌توانید یک شیء DateInterval را با استفاده از سازنده ()DateInterval مقداردهی اولیه کنید. این تابع یک رشته را به عنوان پارامتر می‌پذیرد. رشته بازه زمانی با p آغاز می‌شود که نشان دهنده کلمه period است. پس از آن می‌توانید هر دوره زمانی را با استفاده از عدد صحیح و کاراکتر انتسابی به یک دوره خاص زمانی بیان کنید. برای جزییات بیشتر به مستندات تابع DateInterval مراجعه کنید.

در ادامه مثالی ارائه شده است که میزان سهولت افزودن و تفریق تاریخ‌ها و زمان‌ها در PHP را نمایش می‌دهد.

<?php
 
$now = new DateTime('now');
$the_interval = new DateInterval('P20Y5M20D');
$now->add($the_interval);
 
// Output — It will be Saturday, 05 March, 2039 after 20 years, 05 months and 20 days from today.
echo 'It will be '.$now->format('l, d F, Y').' after '.$the_interval->format("%Y years, %M months and %d days").' from today.';
 
$now = date_create('now');
$the_interval = date_interval_create_from_date_string('20 years 05 months 20 days');
date_add($now, $the_interval);
 
// Output — It will be Saturday, 05 March, 2039 after 20 years, 05 months and 20 days from today.
echo 'It will be '.$now->format('l, d F, Y').' after '.$the_interval->format("%Y years, %M months and %d days").' from today.';
 
?>

شما می‌توانید تاریخ‌ها را نیز با استفاده از عملگرهای مقایسه‌ای در PHP مقایسه کنید. این وضعیت در موارد متعددی مفید خواهد بود. برای نمونه فرض کنید می‌خواهید با استفاده از عملگرهای مقایسه‌ای و دیگر متدهای DateTime، شمارشگری برای روزهای باقی‌مانده تا کریسمس بسازید.

<?php
 
$now = new DateTime('today');
$christmas = new DateTime('25 December 2018');
 
while($now > $christmas) {
    $christmas->add(new DateInterval('P1Y'));
}
 
if($now < $christmas) {
    $interval = $now->diff($christmas);
    echo $interval->format('%a days').' until Christmas!';
}
 
if($now == $christmas) {
    echo 'Merry Christmas :)';
}
 
// Output — 103 days until Christmas!
 
?>

کار خود را با افزودن دو شیء DateTime برای ذخیره‌سازی زمان و تاریخ حاضر و همچنین تاریخ کریسمس امسال آغاز می‌کنیم. پس از آن یک حلقه while اجرا می‌کنیم تا به طور مداوم تا زمانی که به‌روز قبل از کریسمس امسال برسیم، هر روز 1 واحد اضافه کنیم. این وضعیت وقتی که کد در تاریخ 18 ژانویه 2024 اجرا می‌شود مفید خواهد بود. حلقه while تاریخ کریسمس را تا زمانی که کمتر از تاریخ و زمان حاضر در زمان اجرای اسکریپت باشد افزایش می‌دهد.

شمارشگر روز کریسمس ما اینک می‌تواند برای دهه‌ها بدون هیچ مشکلی کار کند.

ملاحظات پایانی

در این راهنما آموختیم که چگونه می‌توانیم تاریخ و زمان کنونی را با استفاده از تابع ()date در قالب مطلوب در خروجی ارائه کنیم. همچنین دیدیم که ()date می‌تواند برای به دست آوردن صرفاً سال؛ ماه و موارد غیره نیز استفاده شود. پس آر آن با برچسب زمان آشنا شدیم و دیدیم که چگونه می‌توان یک برچسب زمانی را به یک رشته تاریخ-زمان معتبر تبدیل کرد. در نهایت شیوه اضافه یا کسر کردن یک دوره زمانی از تاریخ‌های مختلف را یاد گرفتیم.

در این نوشته تلاش کردیم که تابع DateTime و متدهای آن را توضیح دهیم. البته بهتر است برای مطالعات بیشتر سری به مستندات این توابع بزنید. در هر حال هر گونه دیدگاه یا پیشنهاد خود را می‌توانید در بخش نظرات با ما و دیگر خوانندگان فرادرس در میان بگذارید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
tutsplus
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *