downloads | documentation | faq | getting help | mailing lists | reporting bugs | sites | links | my 
search for in the  
view the version of this page
Last updated: Thu, 21 Aug 2003

XVII. Date and Time functions


These functions allow you to get the date and time from the server where your PHP scripts are running. You can use these functions to format the date and time in many different ways.

Note: Please keep in mind that these functions are dependent on the locale settings of your server. Make sure to take daylight saving time and leap years into consideration when working with these functions.


No external libraries are needed to build this extension.


There is no installation needed to use these functions; they are part of the PHP core.

Runtime Configuration

This extension has no configuration directives defined in php.ini.

Resource Types

This extension has no resource types defined.

Predefined Constants

This extension has no constants defined.

Table of Contents
checkdate -- Validate a gregorian date
date -- Format a local time/date
getdate -- Get date/time information
gettimeofday -- Get current time
gmdate -- Format a GMT/UTC date/time
gmmktime -- Get UNIX timestamp for a GMT date
gmstrftime --  Format a GMT/UTC time/date according to locale settings
localtime -- Get the local time
microtime --  Return current UNIX timestamp with microseconds
mktime -- Get UNIX timestamp for a date
strftime --  Format a local time/date according to locale settings
strtotime --  Parse about any English textual datetime description into a UNIX timestamp
time -- Return current UNIX timestamp

add a note add a note User Contributed Notes
Date and Time functions
02-Oct-2003 08:09
One thing PHP really lacks IMHO is an equivalent of ASP's "DateDiff" function.  Here's a function that comes close to duplicating the functionality:

function datediff($interval$date1$date2) {
// Function roughly equivalent to the ASP "DateDiff" function
$seconds $date2 $date1;
$interval) {
$year1$month1$day1) = split('-'date('Y-m-d'$date1));
$year2$month2$day2) = split('-'date('Y-m-d'$date2));
$time1 = (date('H',$date1)*3600) + (date('i',$date1)*60) + (date('s',$date1));
$time2 = (date('H',$date2)*3600) + (date('i',$date2)*60) + (date('s',$date2));
$diff $year2 $year1;
$month1 $month2) {
$diff -= 1;
            } elseif(
$month1 == $month2) {
$day1 $day2) {
$diff -= 1;
                } elseif(
$day1 == $day2) {
$time1 $time2) {
$diff -= 1;
$year1$month1$day1) = split('-'date('Y-m-d'$date1));
$year2$month2$day2) = split('-'date('Y-m-d'$date2));
$time1 = (date('H',$date1)*3600) + (date('i',$date1)*60) + (date('s',$date1));
$time2 = (date('H',$date2)*3600) + (date('i',$date2)*60) + (date('s',$date2));
$diff = ($year2 12 $month2) - ($year1 12 $month1);
$day1 $day2) {
$diff -= 1;
            } elseif(
$day1 == $day2) {
$time1 $time2) {
$diff -= 1;
// Only simple seconds calculation needed from here on
$diff floor($seconds 604800);
$diff floor($seconds 86400);
$diff floor($seconds 3600);
$diff floor($seconds 60);
$diff $seconds;
dkan at netscreen dot com
30-Aug-2003 03:40
Zero-padding is easier to read and less complicated if you use the substr() function instead of an if-then statement.

function printtime() {
   $timenow = getdate();
   $hours = substr("0" . $timenow["hours"], -2);
   $minutes = substr("0" . $timenow["minutes"], -2);
   $seconds = substr("0" . $timenow["seconds"], -2);

   print($hours . " " . $minutes . " " . $seconds);
bitbuster at example dot com
24-Jul-2003 10:01
If you have to compare timestamps, I suggest you do it inside the database.. postgres, for example, allows statements like this:

select (current_timestamp < (select zeitdatum from time_test where zahl=5) );
menaurus at gmx dot de
16-Jul-2003 06:37
The argument has to be in the standard mysql format (y-m-d)...

function age($date) {

if (!$date) return false;

if ($m<$month) $t=-1;
else if ($m==$month) if ($d<$day) $t=-1;

return ($age+$t);

this funktion has got a little bug:
On Line 12 and 13...
12 if ($month<$m) $t=-1;
13 else if ($m==$month AND $day<$d) $t=-1;
you NOSPAM don't need 2 know ETC
24-Mar-2003 11:17

I get a lot of dates which are sent to me in those dastardly Excel spreadsheet things. For example, the date 15 April 1976, Excel stores as 27865.

I convert these to UNIX timestamps using the little function below.

function xl2timestamp($xl_date)
$timestamp = ($xl 25569) * 86400;
garyc at earthling dot net
19-Mar-2003 12:08
I needed to calculate the week number from a given date and vice versa, where the week starts with a Monday and the first week of a year may begin the year before, if the year begins in the middle of the week (Tue-Sun). This is the way weekly magazines calculate their issue numbers.

Here are two functions that do exactly that:

Hope somebody finds this useful.


/*  w e e k n u m b e r  -------------------------------------- //
weeknumber returns a week number from a given date (>1970, <2030)
Wed, 2003-01-01 is in week 1
Mon, 2003-01-06 is in week 2
Wed, 2003-12-31 is in week 53, next years first week
Be careful, there are years with 53 weeks.
// ------------------------------------------------------------ */

function weeknumber ($y, $m, $d) {
    $wn = strftime("%W",mktime(0,0,0,$m,$d,$y));
    $wn += 0; # wn might be a string value
    $firstdayofyear = getdate(mktime(0,0,0,1,1,$y));
    if ($firstdayofyear["wday"] != 1)    # if 1/1 is not a Monday, add 1
        $wn += 1;
    return ($wn);
}    # function weeknumber

/*  d a t e f r o m w e e k  ---------------------------------- //
From a weeknumber, calculates the corresponding date
Input: Year, weeknumber and day offset
Output: Exact date in an associative (named) array
2003, 12, 0: 2003-03-17 (a Monday)
1995,  53, 2: 1995-12-xx
// ------------------------------------------------------------ */

function datefromweek ($y, $w, $o) {

    $days = ($w - 1) * 7 + $o;

    $firstdayofyear = getdate(mktime(0,0,0,1,1,$y));
    if ($firstdayofyear["wday"] == 0) $firstdayofyear["wday"] += 7;
# in getdate, Sunday is 0 instead of 7
    $firstmonday = getdate(mktime(0,0,0,1,1-$firstdayofyear["wday"]+1,$y));
    $calcdate = getdate(mktime(0,0,0,$firstmonday["mon"], $firstmonday["mday"]+$days,$firstmonday["year"]));

    $date["year"] = $calcdate["year"];
    $date["month"] = $calcdate["mon"];
    $date["day"] = $calcdate["mday"];

    return ($date);

}    # function datefromweek
16-Feb-2003 05:23
this function count days between $start and $end dates in mysql format (yyyy-mm-dd)
if one of paramters is 0000-00-00 will return 0
$start date must be less then $end
//For Count Days
function count_days($start$end)
$start != '0000-00-00' and $end != '0000-00-00' )
$timestamp_start strtotime($start);
$timestamp_end strtotime($end);
$timestamp_start >= $timestamp_end ) return 0;
$start_year date("Y",$timestamp_start);
$end_year date("Y"$timestamp_end);
$num_days_start date("z",strtotime($start));
$num_days_end date("z"strtotime($end));
$num_days 0;
$i 0;
$end_year $start_year )
$i < ( $end_year $start_year ) )
$num_days $num_days date("z"strtotime(($start_year $i)."-12-31"));
         return ( 
$num_days_end $num_days ) - $num_days_start;
jlim at natsoft dot com dot my
26-Jan-2003 05:28
For a date() function that supports dates outside the range 1901 and 2038 (by using floats when needed) see adodb_date( ) in
zan at stargeek dot com
25-Jan-2003 01:49
an update to my earlier webcalendar funciton this is a class that uses a table full of start and end dates to generate a webcalendar
brighn (a) yahoo (.) com
03-Jan-2003 01:46
I needed a function that determined the last Sunday of the month. Since it's made for the website's "next meeting" announcement, it goes based on the system clock; also, if today is between Sunday and the end of the month, it figures out the last Sunday of *next* month. lastsunday() takes no arguments and returns the date as a string in the form "January 26, 2003". I could probably have streamlined this quite a bit, but at least it's transparent code. =)

  /* The two functions calculate when the next meeting will
     be, based on the assumption that the meeting will be on
     the last Sunday of the month. */ 

  function getlast($mon, $year) {
    $daysinmonth = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $days = $daysinmonth[$mon-1];
    if ($mon == 2 && ($year % 4) == 0 && (($year % 100) != 0 ||
    ($year % 400) == 0)) $days++;
    if ($mon == 2 && ($year % 4) == 0 && ($year % 1000) != 0) $days++;
    $lastday = getdate(mktime(0,0,0,$mon,$days,$year));
    $wday = $lastday['wday'];
    return getdate(mktime(0,0,0,$mon,$days-$wday,$year));

  function lastsunday() {
    $today = getdate();
    $mon = $today['mon'];
    $year = $today['year'];
    $mday = $today['mday'];
    $lastsun = getlast($mon, $year);
    $sunday = $lastsun['mday'];
    if ($sunday < $mday) {
      if ($mon = 13) {
        $mon = 1;
      $lastsun = getlast($mon, $year);
      $sunday = $lastsun['mday'];
    $nextmeeting = getdate(mktime(0,0,0,$mon,$sunday,$year));
    $month = $nextmeeting['month'];
    $mday = $nextmeeting['mday'];
    $year = $nextmeeting['year'];
    return "$month $mday, $year";
visualmind at php dot net
25-Dec-2002 04:49
Here's a new function for Hejri (Hijri) date conversion, It has a better flawless calculation than the previous posted function and it's implemented to be an official alternative for the php DATE function which returns Arabic Translated date and optionally Hejri converted.
Note: to view arabic titles correctly change view-encoding to Arabic-Windows (windows-1256)

function arabicDate($format, $timestamp) {
       written by Salah Faya (
               [*]hj|ar|en:[jdl][Fmn][Yy][Aa]  ( function handles the rest chars)
               * will add <span dir=rtl lang=ar-sa>..</span>
               echo arabicDate('hj:l d-F-Y 樔', time()); 
               echo arabicDate('ar:l d/F - h:iA', time());
    if (substr($format,0,1)=='*') {
        } else $use_span=false;

    $arDay = array("Sat"=>"蚧?, "Sun"=>"襖?, "Mon"=>"攣僾?, "Tue"=>"呫",
 "Wed"=>"識", "Thu"=>"拺縳", "Fri"=>"枃硭");
    list($d,$m,$y,$dayname,$monthname,$am)=explode(' ',date('d m Y D M a', $timestamp));
    if ($type=='hj:') {
        if (($y>1582)||(($y==1582)&&($m>10))||(($y==1582)&&($m==10)&&($d>14))) {
        } else     {
            $jd = 367*$y-ard_int((7*($y+5001 + ard_int(($m-9)/7)))/4) + ard_int((275*$m)/9)+$d+1729777;
        $l=$l-10631*$n+355;  // Correction: 355 instead of 354
        $j=(ard_int((10985-$l)/5316)) * (ard_int((50*$l)/17719)) + (ard_int($l/5670)) * (ard_int((43*$l)/15238));
        $l=$l-(ard_int((30-$j)/15)) * (ard_int((17719*$j)/50)) - (ard_int($j/16)) * (ard_int((15238*$j)/43))+29;
        $hjMonth = array("蒠栜", "殎?, "捑縩 醱?, "捑縩 侞僾",
 "枃 醱?, "枃 侞僾", "捈?, "婓?, "栜秷?, "娹", "剡 睠珈", "剡 迒?);
        $format=str_replace('j', $d, $format);
        $format=str_replace('d', str_pad($d,2,0,STR_PAD_LEFT), $format);
        $format=str_replace('l', $arDay[$dayname], $format);
        $format=str_replace('F', $hjMonth[$m-1], $format);
        $format=str_replace('m', str_pad($m,2,0,STR_PAD_LEFT), $format);
        $format=str_replace('n', $m, $format);
        $format=str_replace('Y', $y, $format);
        $format=str_replace('y', substr($y,2), $format);
        $format=str_replace('a', substr($ampm[$am],0,1), $format);
        $format=str_replace('A', $ampm[$am], $format);
    } elseif ($type=='ar:') {
        $arMonth=array("Jan"=>"罽?, "Feb"=>"朠捚縼","Mar"=>"蒯晊", "Apr"=>"栔?, "May"=>"蒯翲",
"Jun"=>"翲僾?, "Jul"=>"翲摿?, "Aug"=>"衯?, "Sep"=>"蚧忻", "Oct"=>"戺",
 "Nov"=>"僿楯", "Dec"=>"砅趕");
        $format=str_replace('l', $arDay[$dayname], $format);
        $format=str_replace('F', $arMonth[$monthname], $format);
        $format=str_replace('a', substr($ampm[$am],0,1), $format);
        $format=str_replace('A', $ampm[$am], $format);
    $date = date($format, $timestamp);
    if ($use_span) return '<span dir="rtl" lang="ar-sa">'.$date.'</span>';
    else return $date;

function ard_int($float) {
       return ($float < -0.0000001) ? ceil($float-0.0000001) : floor($float+0.0000001);
eric at nitrateNO_SPAM dot nl
09-Dec-2002 09:16
Here is a quick example of how to iterate through all days
between 2 dates (with a adjustable increment)
//make time stamps from our start & end dates
$start_time = mktime(0,0,0,$start_month,$start_day,$start_year);
$end_time = mktime(0,0,0,$end_month,$end_day,$end_year);

//find the number of days between start_time & end_time
$days = ($end_time - $start_time) / (24 * 3600);
//we want to count the days including the first ..

//select a 1 week interval ..

//find all days (actually periods since we use a increment)
for ($i=0;$i<$days;$i+=$inc)
  //calculate start & end of period using some magic of mktime :)
  $start_date = date("Y-m-d", mktime(0,0,0,$start_month,$start_day+$i,$start_year));
  $end_date = date("Y-m-d", mktime(0,0,0,$start_month,$start_day+$i+$inc-1,$start_year));   
  //print it all ...
  print("Period start:" . $start_date . "\n");
  print("Period end: " . $end_date . "\n");
asg at ftpproxy dot org
25-Sep-2002 03:23
If you like to have the last day of the current month, try this oneliner:

$lastday = strftime ("%d.%m.%Y", (mktime (0,0,0,(date(m)+1),0,(date(Y)))));

nightowl at NOS-PA-M dot uk2 dot net
31-Jul-2002 12:59
I wanted to find all records in my database which match the current week (for a call-back function). I made up this function to find the start and end of the current week :

function week($curtime) {
    $date_array = getdate (time());
    $numdays = $date_array["wday"];
    $startdate = date("Y-m-d", time() - ($numdays * 24*60*60));
    $enddate = date("Y-m-d", time() + ((7 - $numdays) * 24*60*60));

    $week['start'] = $startdate;
    $week['end'] = $enddate;
    return $week;
mwedgwood at ILUVSPAMhotmail dot com
01-Apr-2002 04:24
In vincentv's examples, you should use gmmktime instead of mktime for portability across time zones. For example:

function DateSub($timestamp, $unit, $amount) {
// Possible $units are: "hr", "min", "sec",
//          "mon", "day", or "yr"
// $amount should be an integer
    $delta_vars = array("hr"=>0, "min"=>0,
    "sec"=>0, "mon"=>1,
    $delta_vars[$unit] += $amount;
    $delta = gmmktime($delta_vars["hr"],
    return $timestamp - $delta;
mindaugas at roventa dot lt
18-Feb-2002 07:31
Some lines about LeapYear and day count of month:

    function mod($a,$b)
    $x1=(int) abs($a/$b);
    return $a-($x1*$b);   

    function IsLeapYear($dt)
    $bulis=((mod($y,4)==0) && ((mod ($y,100)<>0) || (mod($y,400)==0)));
    return $bulis;

    function daycount($dt)
    switch ($dc_month)
    case  1:
    case  3:
    case  5:
    case  7:
    case  8:
    case 10:
    case 12:
            return 31;
    case  4:
    case  6:
    case  9:
    case 11:
            return 30;
    case 2:
        if (IsLeapYear($dt)) { return 28; } else { return 29; };
php-contrib at i-ps dot nospam dot net
30-Jan-2002 10:07
Someone may find this info of some use:

Rules for calculating a leap year:

1) If the year divides by 4, it is a leap year (1988, 1992, 1996 are leap years)
2) Unless it divides by 100, in which case it isn't (1900 divides by 4, but was not a leap year)
3) Unless it divides by 400, in which case it is actually a leap year afterall (So 2000 was a leap year).

In practical terms, to work out the number of days in X years, multiply X by 365.2425, rounding DOWN to the last whole number, should give you the number of days.

The result will never be more than one whole day inaccurate, as opposed to multiplying by 365, which, over more years, will create a larger and larger deficit.
vincentv at thevoid dot demon dot nl
08-Feb-2001 09:23
Some general date functions.

function sub($timestamp, $seconds,$minutes,$hours,$days,$months,$years) {
    $mytime = mktime(1+$hours,0+$minutes,0+$seconds,1+$months,1+$days,1970+$years);
    return $timestamp - $mytime;
function add($timestamp, $seconds,$minutes,$hours,$days,$months,$years) {
    $mytime = mktime(1+$hours,0+$minutes,0+$seconds,1+$months,1+$days,1970+$years);
    return $timestamp + $mytime;
function dayOfWeek($timestamp) {
    return intval(strftime("%w",$timestamp));
function daysInMonth($timestamp) {
    $timepieces     = getdate($timestamp);
    $thisYear          = $timepieces["year"];
    $thisMonth         = $timepieces["mon"];
    return $thisDay;
function firstDayOfMonth($timestamp) {
    $timepieces        = getdate($timestamp);
    return mktime(    $timepieces["hours"],
function monthStartWeekDay($timestamp) {
    return dayOfWeek(firstDayOfMonth($timestamp));
function weekDayString($weekday) {
    $myArray = Array(        0 => "Sun",
                            1 => "Mon",
                            2 => "Tue",
                            3 => "Wed",
                            4 => "Thu",
                            5 => "Fri",
                            6 => "Sat");
    return $myArray[$weekday];
function stripTime($timestamp) {
    $timepieces        = getdate($timestamp);
    return mktime(    0,
function getDayOfYear($timestamp) {
    $timepieces        = getdate($timestamp);
    return intval($timepieces["yday"]);
function getYear($timestamp) {
    $timepieces        = getdate($timestamp);
    return intval($timepieces["year"]);
function dayDiff($timestamp1,$timestamp2) {
    $dayInYear1 = getDayOfYear($timestamp1);
    $dayInYear2 = getDayOfYear($timestamp2);
    return ((getYear($dayInYear1)*365 + $dayInYear1) -
            (getYear($dayInYear2)*365 + $dayInYear2));

hope they are usefull to you.

- Vincent
th at definitynet dot com
12-Jan-2001 03:00
I had some problems with dates between mySQL and PHP.  PHP had all these great date functions but I wanted to store a usable value in my database tables. In this case I was using TIMESTAMP(14)  <or 'YYYYMMDDHHMMSS'>.
This is perhaps the easiest way I have found to pull the PHP usable UNIX Datestamp from my mySQL datestamp stored in the tables:

Use the mySQL UNIX_TIMESTAMP() function in your SQL definition string. i.e.

$sql= "SELECT field1, field2, UNIX_TIMESTAMP(field3) as your_date
          FROM your_table
          WHERE field1 = '$value'";

The query will return a temp table with coulms "field1" "Field2" "your_date"

The "your_date" will be formatted in a UNIX TIMESTAMP!  Now you can use the PHP date() function to spew out nice date formats.

Sample using above $sql:
20010111002747  = Date Stored on mySQL table (TIMESTAMP(14))
979172867  = value returned as your_date in sql stmt (UNIX_TIMESTAMP)

if we use $newdate = date("F jS, Y -- g:ia", $row["your_date"]);
   --(after fetching our array from the sql results of course)--

echo "$newdate";              --Will produce:
January 11th, 2001 -- 12:27am

Hope this helps someone out there!
joey dot garcia at usa dot net
14-Nov-2000 04:13
I was trying to make a Month-At-A-Glance and I finally got it to work so I thought I'd share it too.  What you need to get this to work is the "Day Of The Week Number", i.e., Sunday=1 and the "Number Of Days in the Month".  I also used Allan Kent's Date/Time Column at PHPBuilder to get the required information.  I also added the process I used to the requried information.


// *** These are here if you need to calculate the required values ***
// *** Reference Allan Kent's Column on Dates at
//$thismonth =  mktime($hours, $minutes,$seconds ,$month, $day,$year);
//$firstday =  mktime($hours, $minutes,$seconds ,$month, 1,$year);
//$weekdaynum=array("Sun"=>1, "Mon"=>2, "Tue"=>3, "Wed"=>4, "Thu"=>5, "Fri"=>6, "Sat"=>7);

print "<table width=80% align=center border=1>\n";
print"<tr><th>Sun(1)</th> <th>Mon(2)</th> <th>Tue(3)</th> <th>Wed(4)</th> <th>Thu(5)</th> <th>Fri(6)</th> <th>Sat(7)</th> </tr>";
$daysinmonth=31;//For July 2000 this is 31 days
$firstdayofmonth=7;//For July 2000 this is Sat, or day 7
for ($week=1; $week <= 6; $week++){
   for($day=1; $day <=7; $day++){
        if( ($day >= $firstdayofmonth) || ($week >1) ){
            print"<td height=40px>";
                if ($daycount <= $daysinmonth){
                    print $daycount;
            print"<td height=40px> &nbsp; </td>\n";
teddk at box100 dot com
08-Sep-2000 06:02
There is an an excellent article by Allan Kent on PHP date/time. The full article can be found at:
25-Apr-2000 08:44
Regarding the postings regarding MySQL timestamps, please be aware that there are several MySQL date and time types, as documented at

So, in reference to the above posts, nic_lee's algorhythm works on the MySQL TIMESTAMP type, while jmat's function works on the MySQL DATETIME type -- they are NOT the same!

 Last updated: Thu, 21 Aug 2003
show source | credits | sitemap | mirror sites 
Copyright © 2001-2003 The PHP Group
All rights reserved.
This mirror generously provided by:
Last updated: Sat 01 Nov 2003 04:13:36 EST EST