تعداد بازدید: 7192

تاریخ و زمان در php

در ابتدا به دو مفهوم مهم در تاریخ و زمان در زبان پی اچ پی اشاره می کنیم :

Greenwich Mean Time (GMT)

زمان گرینویچ یا زمان استاندارد جهانی که بر اساس منطقه زمانی گرینویچ بدست آمده است. هر منطقه زمانی اختلافی کم تر از ۲۴ ساعت با زمان بین المللی یا همان زمان گرینویچ دارد.

به طور مثال منطقه زمانی Asia/Tehran که مربوط به ایران می شود به اندازه ۴ ساعت و ۳۰ دقیقه با زمان بین المللی گرینویچ اختلاف دارد و نحوه نمایش آن به این صورت است : Asia/Tehran UTC+4:30

برخی کشورها از زمان بین المللی کمتر هستند به طور مثال ایتالیا ۲ ساعت و ۳۰ دقیقه کمتر از زمان بین المللی است . Europe/Rome UTC 2:30

⇐ به طور کلی می توان گفت کشورهایی که در سمت راست نصف النهار گرینویچ قرار دارند با عدد منفی و کشورهایی که در سمت چپ قرار دارند با عدد مثبت .

پس ما یک زمان بین المللی داریم که مربوط به منطقه گرینویچ و یک زمان محلی که مربوط به منطقه ما می شود می باشد.

برای بدست آورد time zone پیش فرض سرور از تابع زیر استفاده کنید. (این تابع ورودی ندارد و خروجی اش time zone پیش فرض است)

<?php date_default_timezone_get (); ?>

نکته : منطقه زمانی پیش فرض سرور ما ممکن است روی گروینویچ نباشد . به طور مثال روی Eroupe/Berline باشد.(سرور XAMPP). پس پیش فرض سرور برابر گرینویچ نیست.

برای set کردن time zone محلی خودتان می توانید از تابع زیر استفاده کنید.

<?php date_default_timezone_set ( string $timezone_identifier ); ?>

پارامتر ورودی تابع بالا یک رشته مبین time zone مد نظر شما می باشد. به طور مثال Asia/Tehran

نکته : در پروژه های خود در زمانی که پروژه initialize می شود time zone را تعیین کنید. (در صورت نیاز)

نکته : اگر از کتابخانه تاریخ جلالی jdate استفاده می کنید نیازی به تعیین time zone برای کشور ایران ندارید .

timestamp (Unix Time)

timestamp یک عدد صحیح (integer) که بیانگر تعداد ثانیه های گذشته از نیمه شب (00:00:00) ۱ ژانویه ۱۹۷۰ میلادی است در ناحیه زمانی گرینویچ (GMT) است.

نکته : timestamp یک عدد ثابت برای تمامی مناطق زمانی است. یعنی چه در منظقه زمانی Asia/Tehran مقدار بگیرید و چه در منظقه Europe/Rome یک عدد یکتا به شما بر میگرداند. پس timestamp به منظقه زمانی ارتباطی ندارد.

از روی timestamp شما می توانید تاریخ و زمان برحسب منطقه زمانی خودتان را بدست آورید. به طوری که در مرحله اول timestamp به زمان گرینویچ (GMT) تبدیل می شود و در مرحله بعد با توجه به منظقه زمانی شما زمان لازم کم یا زیاد می شود و زمان محلی شما بدست می آید.

timestamp GMT time Local time

بدست آوردن timestamp در php

برای بدست آوردن timestamp در زمان حال (همین الان !) از تابع time استفاده می کنیم.

<?php time(); ?>

برای بدست آوردن timestamp در زمان دلخواه (میلادی) باید از تابع mktime استفاده کنیم.

<?php mktime ($hour,$minute,$second,$month,$day,$yeart); ?>

همچنین به وسیله تابع strtotime هم می توانید timestamp رو بدست بیارید. کافیه فرمت نوشتاری تاریخ رو به عنوان ورودی بهش بدید.

<?php strtotime($time_string); ?>

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

فرمت ورودی که به این تابع داده میشه می تونه شکل های مختلفی داشته باشه :

  • به صورت نوشتاری : “2015-01-01”
  • همراه با کلمات مربوطه: “+1 week 2 days 4 hours 2 seconds”
  • همراه نام ماه : “10 September 2000”
  • همین الان : “now”
  • یکشنبه بعد :‌ “next sunday”
  • فردا “tomorrow”

بدست آوردن تاریخ با استفاده date و getdate

ساختار کلی تابع date به شکل زیر می باشد :

<?php date ($format , $timestamp ); ?>

پارامتر اول فرمت خروجی تاریخ رو مشخص می کنه که به اشکال زیر قابل تعیینه . (هر کاراکتر یه خروجی خاص داره). برخی مواردش رو در جدول زیر مشاهده می فرمایید.

کاراکتر توضیحات مثالی از خروجی
d  شماره روز از ماه ، یک عدد مابین ۰۱ تا ۳۱  01 to 31
D روز هفته به صورت سه حرفی Mon through Sun
j روز ماه بدون صفر 1 to 31
l نام روز هفته به صورت کامل Sunday
F نام کامل ماه January
m شماره ماه به صورت عددی 01 through 12
M نام ماه به صورت سه حرفی Jan
n شماره ماه به صورت عددی بدون صفر در ابتدا 1 through 12
Y شماره سال به صورت کامل 1999 or 2003
y شماره سال به صورت خلاصه دو کاراکتری 99 or 03
 h  ساعت به صورت بر مبنای ۱۲ ساعت  01 through 12
H ساعت بر مبنای ۲۴ ساعت 00 through 23
i دقیقه همراه با صفری در پشت 00 through 23
s ثانیه به همراه صفری در پشت 00 through 59
a قبل از ظهر و بعد از ظهر به صورت حروف کوچک am or pm
U تعداد ثانیه های گذرانده شده از ۱ ژانویه ۱۹۷۰ (timestamp)

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

نکته : تابع date پارامتری برای تعیین TimeZone ندارد. برای تغییر TimeZone باید قبل از استفاده از تابع date منطقه زمانی را بوسیله تابع  date_default_timezone_set تغییر دهید.

نکته : اگر المان های تاریخ را به صورت یک آرایه می خواهید ، مثلا سال و ماه و روز و … می توانید از تابع getdate استفاده کنید که ورودی آن timestamp تاریخ مد نظر شماست.

<?php print_r(getdate()); ?>

خروجی به شکل زیر خواهد بود :

Array ( [seconds] => 33 [minutes] => 20 [hours] => 18 [mday] => 2 [wday] => 3 [mon] => 5 [year] => 2018 [yday] => 121 [weekday] => Wednesday [month] => May [0] => 1525269033 )

نکاتی پیرامون خانه هایی که مربوط به روز در آرایه بالا می باشد:

  • yday : روز از سال که از ۱ تا ۳۶۵ می باشد.
  • weekday : روز از هفته که از sunday تا saturday می باشد.
  • mday : که برابر با روز از ماه می باشد. که از ۱ تا آخرین روز ماه می باشد.

نکته : دقت داشته باشید که تابع getdate برخلاف تابع date فرمت نمی گیرد چون خروجی آن به صورت آرایه است و تنها ورودی آن timestamp است.

 کلاس DateTime

اگر نرم افزاری که در حال پیاده سازی آن هستید نیاز به کاربا تاریخ و زمان به صورت حرفه ای تر (مثلا محاسبه اختلاف جمع یا تفریق زمان ) دارد می توانید از کلاس DateTime استفاده کنید.به عنوان پارامتر سازنده می توانید تاریخ مد نظرتان را بدهید در غیر این صورت تاریخ جاری به آن تعلق می گیرد.(ورودی اون شبیه تابع strtotime است)

<?php $d1 = new DateTime("2015-01-02"); ?>

متغیر $d1 به عنوان یک handler برای استفاده از متدهای این کلاس (نظیر نمایش تاریخ با فرمت خاص ، افزودن دوره و …) استفاده می شود.

کلاس DateInterval

برای تولید یک بازه زمانی است به طور مثال 🙂  یک سال و سه ماه و چهارده روز و سه ساعت و یازده دقیقه و سی ثانیه 🙂

خوب تعریفی که در بالا دیدید که دوره یا Period است که میتونه به یک زمان اضافه یا کم بشه. پس این کلاس می تونه به استفاده از متد های کلاس DateTime به ما کمک کنه.

<?php new DateInterval("P5Y3M28DT1H20I12S"); ?>

ورودی های این تابع با استفاده از کاراکتر P به عنوان Period و کاراکتر T به عنوان Time تمییز میشه.

P 5Y 3M 28D T 1h 20i 12s

رشته کاراکتر بالا به معنی ۵ سال و ۳ ماه و ۲۸ روز و ۱ ساعت و ۲۰ دقیقه و ۱۲ ثانیه است. البته دقت داشته باشید که فاصله در میان کاراکتر ها نذارید.(در رشته بالا برای درک راحت تر فاصله گذاشته شده).

متدهایی در تابع DateTime وجود دارد که برخی از آن ها را توضیح می دهیم.

  • diff : برای بدست آوردن اختلاف زمانی دو تاریخ. خروجی اختلاف زمانی دو تاریخ است.
  • sub :‌ برای کم کردن یک تاریخ از تاریخ دیگر.
  • add : برای جمع کردن دو تاریخ.
  • format : برای نمایش تاریخ به فرمت ورودی .
  • setTimezone :‌ تعیین منطقه زمانی.

نکته : هر تاریخ باید instanse از کلاس DateTime باشد.در مثال زیر به طور عملی مشاهده کنید:

<?php
$d1 = new DateTime("2015-01-02");
echo $d1->format("Y-d-m") . '<br>';
$d2 = new DateTime("2015-04-30");
print_r($d1->diff($d2));
echo '<br>';
//$d1->add(new DateInterval("P3M28D"));
$d2->sub(new DateInterval("P3M28D"));
echo $d1->format("Y-d-m") .'<br>';
print_r($d1->diff($d2));

تعیین timestamp بر اساس TimeZone

برای این کار از دو کلاس DateTimeZone و DateTime استفاده می کنیم.

echo "<b>GlobalTimeStamp: </b>" . time() . "<br>"; //1526161379
//Asia/tehran
$date = new DateTime(null, new DateTimeZone('Asia/tehran')); 
echo 'Asia/tehran: '.$date->getTimestamp().'<br />'."\r\n"; //1526161379

//Default + Offset

//Asia/tehran
$date = new DateTime(null, new DateTimeZone('Asia/tehran'));
echo 'Asia/tehran: '.($date->getTimestamp() + $date->getOffset()).'<br />'."\r\n"; //1526177579
  • همان طور که در بالا مشاهده کردید مقدار timestamp برای تهران و تمامی TimeZone ها یکتا است.
  • اگر عدد 1526177579 را از عدد 1526161379 کم کنیم عدد ۱۶۲۰۰ بدست می آید که برابر اختلاف ثانیه تهران با گرینویچ است.
  • اختلاف زمانی تهران با گرینویچ برابر ۱۶۲۰۰ ثانیه است که می شود ۴:۳۰ ساعت . به همین دلیل با علامت GMT+4.5 نمایش داده می شود.
  • در حقیقت خروجی متد getOffset همان مقدار ۱۶۲۰۰ ثانیه برای منطقه زمانی Asia/tehran است.
  • در مثال های بالا ما مقدار حال یا پیش فرض را به کلاس DateTime دادیم . شما می توانید یک مقدار رشته ای با زمان مد نظر خود بدهید.

 

مطالب مشابه

php socket programming

PHP Socket Programming – Part2

برنامه نویسی سوکت فرآیندی است که در آن یک یا چند کلاینت از طریق پورت یکسان یا متفاوت به سرور متصل می شوند و این اتصال...

هدر های Http در درخواست و پاسخ

Http Headers (قسمت اول)

هر گاه اطلاعاتی را از سرور نیاز داشته باشیم باید یک درخواست به آن بزنیم و پاسخ را از سمت سرور دریافت کنیم. بر این...

افزونه CURL در PHP

برای ایجاد یک درخواست راه های متفاوتی وجود دارد. اگر درخواست از نوع GET باشد راه های ساده تری نظیر تابع...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای تاریخ و زمان در php

دیدگاهتان را بنویسید

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