تاریخ ها در php

تاریخ در PHP

تابع date() برای فرمت بندی تاریخ و زمان در PHP به کار می رود. تاریخ در PHP مانند تمام زبانهای برنامه نویسی دیگر نیاز به تبدیل شدن به موارد دیگر و فرمت بندی دارد. حتی برای منطقه های زمانی مختلف نیاز هست که تاریخ های متفاوت به کار برده شود.

تاریخ در PHP به دو صورت به کار میرود. یکی timestamp که تعداد ثانیه ها را از سال ۱ ژانویه ۱۹۷۰ از ساعت ۰۰:۰۰:۰۰ GMT را به عدد نمایش می دهد و دیگری بصورت رشته ای می باشد که همه روزه ما از آن استفاده می کنیم و قابل فهم برای انسان می باشد.

دریافت تاریخ در PHP توسط تابع date

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

قالب کلی تابع date() به صورت زیر است.

date(format,timestamp) 
  • format: فرمت “timestamp” را مشخص می کند.
  • timestamp: زمان timestamp را مشخص می کند. زمان پیش فرض تاریخ و زمان اکنون می باشد. این پارامتر اختیاری می باشد.
echo "Today is: " . date("Y/m/d");
---------------------
Today is: 2022/08/13
echo "Today is: " . date("Y-m-d");
-------------------
Today is: 2022-08-13

پارامتر format نحوه قالب بندی تاریخ و یا زمان را مشخص می کند. فرمت بندی باید مطابق استاندارد PHP باشد که در اینجا می توانید استاندارد را مشاهده نمایید.

در قالب بندی تاریخ و زمان کاراکترهایی استفاده می شود که هر کدام معنی و مفهوم خاص خود را دارد که در زیر توضیحات آنها وجود دارد:

  • Y: نمایش سال بصورت چهار رقمی (۲۰۲۲)
  • y: نمایش سال بصورت دو رقمی (۲۲)
  • M: نمایش نام ماه بصورت سه حرفی (Aug)
  • m: نمایش ماه به عدد (۰۱ – ۱۲) (۰۸)
  • n: نمایش ماه به عدد بدون صفر (۱ – ۱۲) (۸)
  • F: نمایش نام ماه را به صورت حروف (August)
  • D: نمایش روز هفته بصورت سه حرفی (Sat)
  • w: نمایش روز هفته بدون صفر (۰ – ۶)
  • d: نمایش روز از ماه (۰۱ – ۳۱) (۱۳)
  • j: نمایش روز از ماه بدون صفر (۱ – ۳۱) (۵)
  • S: افزودن پسوند انگلیسی مانند th (10th)
  • H: ساعت را به صورت ۲۴ ساعت نمایش می دهد (۰۰ – ۲۴) (۱۷)
  • h: نمایش ساعت بصورت ۱۲ ساعته (۰۱ – ۱۲ بهمراه صفر) (۰۵)
  • G:نمایش ساعت بصورت ۲۴ ساعته بدون صفر (۰ – ۲۴) (۱۷)
  • g: نمایش ساعت بصورت ۱۲ ساعته بدون صفر (۱ – ۱۲) (۵)
  • i: نمایش دقیقه (۰۰ – ۵۹) (۲۴)
  • s: نمایش ثانیه ها (۰۰ – ۵۹) (۳۶)
  • a: نمایش am و pm بصورت حروف کوچک (pm)
  • A: نمایش AM و PM بصورت حروف بزرگ (PM)
  • t: تعداد روزهای ماه (۲۸ – ۳۱) (ماه فوریه ۲۸ روز است)
  • L: اگر سال کبیسه بود ۱ و اگر نه ۰ برمی گرداند
  • l: نمایش روز از هفته بصورت حروفی (L کوچک) (Saturday)
  • z: روز از سال بدون صفر (۰ – ۳۶۵)
  • U: تعداد ثانیه ها از تاریخ اول ژانویه ۱۹۷۰ (همان timestamp در Unix)
  • O: افست منطقه زمانی را از گرینویچ نمایش می دهد
echo "Today is: " . date("Y-m-d H:i:s a => l") . "<br/>";
echo "Today is: " . date("Y-m-d h:i:s A");
--------------------
Today is: 2022-08-13 14:33:57 pm => Saturday
Today is: 2022-08-13 02:33:57 PM

تعریف منطقه مکانی (Time Zone)

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

date_default_timezone_set("Australia/Sydney");
echo "Today is: " . date("Y-m-d h:i:s A");
-------------------------------
Today is: 2022-08-14 12:56:15 AM

در مثال بالا منطقه زمانی را به Sydney تغییر دادیم. برای دریافت منطقه های زمانی می توانید از اینجا آنها را دریافت نمایید.

تابع time

همانطور که از نام تابع پیداست، از این تابع برای بدست آوردن زمان اکنون بصورت Unix استفاده می شود.

echo "Time is: " . time() . "<br/>";
echo date("Y m d h:i:s", time());
----------------
Time is: 1660458590
۲۰۲۲ ۰۸ ۱۴ ۰۶:۲۹:۵۰

در مثال از تابع time() و date() برای ایجاد تاریخ و زمان استفاده شده است.

ایجاد تاریخ با تابع mktime

این تابع زمان Unix را باز می گرداند. این زمان تعداد ثانیه ها را از سال ۱ ژانویه ۱۹۷۰ از ساعت ۰۰:۰۰:۰۰ GMT تا به الان را باز می گرداند.

قالب کلی تابع mktime() بصورت زیر می باشد.

mktime(hour, minute, second, month, day, year)
$da = mktime(11, 14, 54, 8, 13, 2022);
echo "The date is " . date("Y-m-d h:i:sa", $da);
------------------
The date is 2022-08-13 11:14:54am

در مثال بالا از تابع date() و mktime() برای ایجاد تاریخ استفاده نموده ایم.

ایجاد تاریخ در PHP از روی رشته با استفاده از تابع strtotime

شما نمی توانید از روی تعداد ثانیه ها که یک عدد بزرگی است، تشخیص دهید که چه روزی هست و کامپیوتر هم تاریخی که انسانها استفاده می کنند برایش ناخوانا است. از این تابع برای تبدیل تاریخی که انسانها استفاده می کنند به تاریخ Unix استفاده می شود.

strtotime(time, now)
$da = strtotime("10:30pm August 14 2022");
echo "The date is " . date("Y-m-d h:i:sa", $da);
--------------------
The date is 2022-08-14 10:30:00pm

این مثال تاریخ معمولی را به تاریخ Unix تبدیل می کند.

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

$da=strtotime("tomorrow");
echo date("Y-m-d h:i:sa", $da) . "<br>";

$da=strtotime("next Saturday");
echo date("Y-m-d h:i:sa", $da) . "<br>";

$da=strtotime("+3 Months");
echo date("Y-m-d h:i:sa", $da);
-----------------------
۲۰۲۲-۰۸-۱۵ ۱۲:۰۰:۰۰am
۲۰۲۲-۰۸-۲۰ ۱۲:۰۰:۰۰am
۲۰۲۲-۱۱-۱۴ ۰۵:۵۲:۰۸am

تنها نکته ای که باید به آن توجه کنید این است که حروف داخل این تابع باید درست نوشته شوند.

کلاس DateTime

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

var_dump(new DateTime());
----------------
object(DateTime)[1]
  public 'date' => string '2022-08-14 07:34:57.729491' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'UTC' (length=3)
$now = new DateTime();
echo $now->format("Y-m-d h:i:s A");
----------------
۲۰۲۲-۰۸-۱۴ ۰۷:۴۷:۰۲ AM

این مثال مانند تابع date() عمل می کند.

echo $now->getTimestamp();
------------------
۱۶۶۰۴۶۳۳۴۵

این مثال هم مانند تابع time() عمل می کند.

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

$date = new DateTime("2015-07-14");
var_dump($date);
-------------------
object(DateTime)[1]
  public 'date' => string '2015-07-14 00:00:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'UTC' (length=3)

و یا

$date = new DateTime();
$date->setTimestamp(1634142890);
var_dump($date);
----------------
object(DateTime)[1]
  public 'date' => string '2021-10-13 16:34:50.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'UTC' (length=3)

و یا

$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');
echo $new_date_format;

حال فرض کنیم می خواهیم مانند بالا منطقه زمانی را هم اعمال کنیم. برای این کار در کلاس DateTime مانند زیر عمل می کنیم.

$timezone = new DateTimeZone("Australia/Sydney");
$date = new DateTime("2021-10-13 05:00", $timezone);
var_dump($date);
-------------------
object(DateTime)[2]
  public 'date' => string '2021-10-13 05:00:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Australia/Sydney' (length=16)

جمع، تفریق و مقایسه تاریخ ها در PHP

امکان افزودن، تفریق و مقایسه تاریخ ها در PHP وجود دارد. برای اینکار می توان از توابع date_add() و date_sub() برای جمع، date_diff() برای تفریق و اختلاف دو تاریخ استفاده کرد.

افزودن تاریخ ها در PHP

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

$Date = "2022-05-10";
echo date('Y-m-d', strtotime($Date. ' + 10 days'));
-----------------
۲۰۲۲-۰۵-۲۰

و یا

$date = date_create("2022-05-10");
date_add($date, date_interval_create_from_date_string("10 days"));
echo date_format($date, "Y-m-d");
----------------
۲۰۲۲-۰۵-۲۰

و یا

$date1 = '2022-05-10';
$date = new DateTime($date1);
$date->add(new DateInterval('P10D')); // P10D means a period of 10 day
$date2 = $date->format('Y-m-d');
echo $date2;
-----------------
۲۰۲۲-۰۵-۲۰

در این مثال از P10D استفاده شده است که جهت اطلاعات بیشتر می توانید به اینجا مراجعه نمایید.

تفریق تاریخ ها

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

$now = date_create('now');
$future = date_create('last day of January 2024');
$interval = date_diff($now, $future);
echo $interval->format('%Y years, %M months and %d days');
------------------------
۰۱ years, 05 months and 16 days
$now = new DateTime('now');
$future = new DateTime('last day of January 2024');
$interval = $now->diff($future);
echo $interval->format('%Y years, %M months and %d days');
------------------
۰۱ years, 05 months and 16 days

مقایسه دو تاریخ در PHP

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

$date1 = "1998-11-24";
$date2 = "1997-03-26";

if ($date1 > $date2)
    echo "$date1 is latest than $date2";
else
    echo "$date1 is older than $date2";
-------------------
۱۹۹۸-۱۱-۲۴ is latest than 1997-03-26

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

$date1 = "12-03-26";
$date2 = "2011-10-24";

$dateTimestamp1 = strtotime($date1);
$dateTimestamp2 = strtotime($date2);

if ($dateTimestamp1 > $dateTimestamp2)
    echo "$date1 is latest than $date2";
else
    echo "$date1 is older than $date2";
-----------------------
۱۲-۰۳-۲۶ is latest than 2011-10-24

با استفاده از کلاس DateTime

$date1 = new DateTime("12-11-24");
$date2 = new DateTime("2011-03-26");

if ($date1 > $date2)
    echo $date1->format("Y-m-d") . " is latest than " . $date2->format("Y-m-d");
else
    echo $date1->format("Y-m-d") . " is older than "  . $date2->format("Y-m-d");
--------------------
۲۰۱۲-۱۱-۲۴ is latest than 2011-03-26

مطالب مرتبط