PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

checkdate> <cyrus_unbind
Last updated: Sun, 25 Nov 2007

view this page in

Date/Time 日期/时间函数

简介

可以用这些函数得到 PHP 所运行的服务器的日期和时间。可以用这些函数将日期和时间以很多不同方式格式化输出。

Note: 请留意这些函数依赖于服务器的地区设置。确认在使用这些函数时考虑到了夏令时的设置(例如使用 $date = strtotime('+7 days', $date) 而不是 $date += 7*24*60*60)和闰年。

Note: 该部份所提及的时区可参考所支持时区列表

需求

要编译本扩展模块无需外部库文件。

安装

本扩展模块作为 PHP 内核的一部分,无需安装即可使用。

运行时配置

本扩展模块在 php.ini 中未定义任何配置选项。

运行时配置

这些函数的行为受 php.ini 的影响。

日期/时间配置选项
名称 默认值 可修改范围 更新记录
date.default_latitude "31.7667" PHP_INI_ALL 自 PHP 5.0.0 起可用
date.default_longitude "35.2333" PHP_INI_ALL 自 PHP 5.0.0 起可用
date.sunrise_zenith "90.83" PHP_INI_ALL 自 PHP 5.0.0 起可用
date.sunset_zenith "90.83" PHP_INI_ALL 自 PHP 5.0.0 起可用
date.timezone "" PHP_INI_ALL 自 PHP 5.0.0 起可用
有关 PHP_INI_* 常量进一步的细节与定义参见php.ini 配置选项

以下是配置选项的简要解释。

date.default_latitude float

默认纬度。

date.default_longitude float

默认经度。

date.sunrise_zenith float

默认日出天顶。

date.sunset_zenith float

默认日落天顶。

date.timezone string

在未设定 TZ 环境变量时用于所有日期/时间函数的默认时区。优先顺序在 date_default_timezone_get() 页面中有说明。

Note: 前四个配置选项目前仅用于 date_sunrise()date_sunset()

资源类型

本扩展模块未定义任何资源类型。

预定义常量

自 PHP 5.1.1 起定义有以下常量来提供标准日期表达方法,可以用于日期格式函数(例如 date())。

DATE_ATOMstring
原子钟格式(如:2005-08-15T15:52:01+00:00)
DATE_COOKIEstring
HTTP Cookies 格式(如:Mon, 15 Aug 2005 15:52:01 UTC)
DATE_ISO8601string
ISO-8601(如:2005-08-15T15:52:01+0000)
DATE_RFC822string
RFC 822(如:Mon, 15 Aug 2005 15:52:01 UTC)
DATE_RFC850string
RFC 850(如:Monday, 15-Aug-05 15:52:01 UTC)
DATE_RFC1036string
RFC 1036(如:Monday, 15-Aug-05 15:52:01 UTC)
DATE_RFC1123string
RFC 1123(如:Mon, 15 Aug 2005 15:52:01 UTC)
DATE_RFC2822string
RFC 2822(如:Mon, 15 Aug 2005 15:52:01 +0000)
DATE_RSSstring
RSS(如:Mon, 15 Aug 2005 15:52:01 UTC)
DATE_W3Cstring
World Wide Web Consortium(如:2005-08-15T15:52:01+00:00)

Table of Contents



checkdate> <cyrus_unbind
Last updated: Sun, 25 Nov 2007
 
add a note add a note User Contributed Notes
Date/Time
Robb_Bean at gmx dot nospam dot net
19-Mar-2008 07:47
With PHP 5.1 and 5.2 the languages datetime support has changed. Although these functions should guess your local timezone settings, they may fail if using a default configuration in a "pre-5.1 way", which means setting no timezone for PHP. In the case PHP could not get a timezone it emits a E_STRICT warning. Note that this affects _all_ datetime functions and keep it in mind when porting software from previous versions to 5.1 or later! It may also confuse your error handling (this is the way I noticed that things have changed, since these changes are not documentated _here_).

References:

http://www.php.net/manual/de/migration51.datetime.php
http://www.php.net/manual/de/migration52.datetime.php
sagar
29-Feb-2008 12:53
<?php
####################################
# Provide week number and get start_timestamp and end_timestamp
#####################################

// this week number will come from the timeshare form
 
$week = 51;

$times = get_start_and_end_date_from_week($week);
$start_time = $times['start_timestamp'];
$end_time = $times['end_timestamp'];

function
get_start_and_end_date_from_week ($w)
{
   
$y = date("Y", time());
   
$o = 6; // week starts from sunday by default

   
$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"]));

   
$sday = $calcdate["mday"];
   
$smonth = $calcdate["mon"];
   
$syear = $calcdate["year"];
   
       
   
$timestamp['start_timestamp'] =  mktime(0, 0, 0, $smonth, $sday, $syear);
   
$timestamp['end_timestamp'] =  $timestamp['start_timestamp'] + (60*60*24*7);

    return
$timestamp;

}   
# function datefromweek
?>
nate at example dot com
05-Feb-2008 08:56
Here's my version of date diff that handles leap years, DST, and deals with the diff in terms of "human calculations". For example, this code does not assume that a year = 365.25 days, or that a month = 30/31 days. The results are exactly what a human being would determine as a good result.

<?php

/**
 * this code assumes php >= 5.1.0. if using < 5.1, read
 * php.net/strtotime and change the condition for checking
 * for failure from strtotime()
 */

// $t1, $t2: unix times, or strtotime parseable
// $precision: max number of units to output
// $abbr: if true, use "hr" instead of "hour", etc.
function date_diff ($t1, $t2, $precision = 6, $abbr = false) {
    if (
preg_match('/\D/', $t1) && ($t1 = strtotime($t1)) === false)
        return
false;

    if (
preg_match('/\D/', $t2) && ($t2 = strtotime($t2)) === false)
        return
false;

    if (
$t1 > $t2)
        list(
$t1, $t2) = array($t2, $t1);

   
$diffs = array(
       
'year' => 0, 'month' => 0, 'day' => 0,
       
'hour' => 0, 'minute' => 0, 'second' => 0,
    );

   
$abbrs = array(
       
'year' => 'yr', 'month' => 'mth', 'day' => 'day',
       
'hour' => 'hr', 'minute' => 'min', 'second' => 'sec'
   
);

    foreach (
array_keys($diffs) as $interval) {
        while (
$t2 >= ($t3 = strtotime("+1 ${interval}", $t1))) {
           
$t1 = $t3;
            ++
$diffs[$interval];
        }
    }

   
$stack = array();
    foreach (
$diffs as $interval => $num)
       
$stack[] = array($num, ($abbr ? $abbrs[$interval] : $interval) . ($num != 1 ? 's' : ''));

   
$ret = array();
    while (
count($ret) < $precision && ($item = array_shift($stack)) !== null) {
        if (
$item[0] > 0)
           
$ret[] = "{$item[0]} {$item[1]}";
    }

    return
implode(', ', $ret);
}

$t1 = 'Feb 4, 2008 12:16:00';
$t2 = 'Jul 3, 2006 16:15:30';

echo
date_diff($t1, $t2), "\n",
   
date_diff($t1, $t2, 3), "\n",
   
date_diff($t1, $t2, 2, true), "\n";

?>
stoicnluv at gmail dot com
06-Nov-2007 07:14
A better and accurate function to calculate the difference between 2 dates. Takes leap years and DST into consideration. Accepts string date or timestamp as arguments.

<?php
function date_diff($d1, $d2){
   
$d1 = (is_string($d1) ? strtotime($d1) : $d1);
   
$d2 = (is_string($d2) ? strtotime($d2) : $d2);

   
$diff_secs = abs($d1 - $d2);
   
$base_year = min(date("Y", $d1), date("Y", $d2));

   
$diff = mktime(0, 0, $diff_secs, 1, 1, $base_year);
    return array(
       
"years" => date("Y", $diff) - $base_year,
       
"months_total" => (date("Y", $diff) - $base_year) * 12 + date("n", $diff) - 1,
       
"months" => date("n", $diff) - 1,
       
"days_total" => floor($diff_secs / (3600 * 24)),
       
"days" => date("j", $diff) - 1,
       
"hours_total" => floor($diff_secs / 3600),
       
"hours" => date("G", $diff),
       
"minutes_total" => floor($diff_secs / 60),
       
"minutes" => (int) date("i", $diff),
       
"seconds_total" => $diff_secs,
       
"seconds" => (int) date("s", $diff)
    );
}

$a = date_diff("2006-11-01", "2007-11-01");

echo
"<pre>";
print_r($a);
echo
"</pre>";
?>

This example will output (if your timezone uses US DST):

Array
(
    [years] => 0
    [months_total] => 11
    [months] => 11
    [days_total] => 364
    [days] => 30
    [hours_total] => 8759
    [hours] => 23
    [minutes_total] => 525540
    [minutes] => 0
    [seconds_total] => 31532400
    [seconds] => 0
)

As you can see, the result is not exactly 1 year (less 1 hour) since Nov 1, 2006 is not DST while Nov 1, 2007 is DST.
venoel at rin dot ru
26-Oct-2007 06:33
May be useful for somebody. This function takes on daylight saving time

<?php
Function DateDiff($date1,$date2) {
 
$timedifference=$date2-$date1;
 
$corr=date("I",$date2)-date("I",$date1);
 
$timedifference+=$corr;
  return
$timedifference;
}
?>

Example:

<?php
$d1
=mktime(2,0,0,10,28,2007);
$d2=mktime(4,0,0,10,28,2007);
$period=DateDiff($d1,$d2);
printf("<br>%s",date("I d.m.Y H:i",$d1));
printf("<br>%u hour",$period/3600);
printf("<br>%s",date("I d.m.Y H:i",$d2));
?>

Getting 2 hour instead 3.
koch.ro
18-Oct-2007 03:42
Not really elegant, but tells you, if your installed timezonedb is the most recent:

<?php
class TestDateTimeTimezonedbVersion extends PHPUnit_Framework_TestCase
{
    public function
testTimezonedbIsMostRecent()
    {
       
ini_set( 'date.timezone', 'Europe/Berlin' );
       
ob_start();                                                                                                       
       
phpinfo(INFO_MODULES);
       
$info = ob_get_contents();                                                                                        
       
ob_end_clean();
       
$start = strpos( $info, 'Timezone Database Version' ) + 29;

       
$this->assertTrue( FALSE !== $start, 'Seems there is no timezone DB installed' );

       
$end   = strpos( $info, "\n", $start );
       
$installedVersion = substr( $info, $start, $end - $start );

       
exec( 'pecl remote-info timezonedb', &$output );
       
$availableVersion = substr( $output[2], 12 );

       
$this->assertEquals( $availableVersion, $installedVersion,
       
'The installed timezonedb is not actual. Installed: '.$installedVersion
       
.' available: '.$availableVersion
       
);
    }
}
?>
herbert DOT fischer ATT gEE mail DOT com
12-Oct-2007 04:44
Updating internal's PHP timezone database (5.1.x and 5.2.x)

http://fischer.tecnologia.ws/en/node/1

[editor: Although this does work, it's often easier just to install the pecl timezonedb extension - they should be up-to-date with the latest possible information]
aquatakat at telus dot net
25-Sep-2007 04:25
I wrote a simple script to format a duration in seconds. Give the function some value in seconds and it will return an array.

<?php

function format_duration($seconds) {

   
$periods = array(
       
'centuries' => 3155692600,
       
'decades' => 315569260,
       
'years' => 31556926,
       
'months' => 2629743,
       
'weeks' => 604800,
       
'days' => 86400,
       
'hours' => 3600,
       
'minutes' => 60,
       
'seconds' => 1
   
);

   
$durations = array();

    foreach (
$periods as $period => $seconds_in_period) {
        if (
$seconds >= $seconds_in_period) {
           
$durations[$period] = floor($seconds / $seconds_in_period);
           
$seconds -= $durations[$period] * $seconds_in_period;
        }
    }
   
    return
$durations;

}

echo
format_duration(864);

/*
[minutes] => 14
[seconds] => 24
*/

echo format_duration(3600);

/*
[hours] => 1
*/

echo format_duration(11111111);

/*
[months] => 4
[days] => 6
[hours] => 20
[minutes] => 28
[seconds] => 59
*/

?>
Darren Edwards
06-Sep-2007 11:54
I was looking for a solution where I could return the number of days, hours, Minutes and seconds between two entries in a table.
DATE_DIFF is not running on my mysql server as my provider uses mysql version 4.0.25
Solution was to use to days and std time functions to calculate the difference in one call.
The fields stored in the table(report_table) are
time(00:00:00),
date(0000-00-00) and record(enum) which tells the app the type of log stored. EG start or end of a report.

SELECT
(TO_DAYS( `end`.`date` ) - TO_DAYS( `start`.`date` ))
-
( second( `end`.`time` ) + (minute( `end`.`time` )*60) + (hour( `end`.`time` )*3600)
<
 second( `start`.`time` ) + (minute( `start`.`time` )*60) + (hour( `start`.`time` )*3600))
AS `days` ,
SEC_TO_TIME(
(second( `end`.`time` ) + (minute( `end`.`time` )*60) + (hour( `end`.`time` )*3600) )
-
(second( `start`.`time` ) + (minute( `start`.`time` )*60) + (hour( `start`.`time` )*3600) )
 ) AS `hms`,
`start`.`time` as `start`,
`end`.`time`  as `end`

FROM `report_table` AS `start` , `report_table` AS `end`
AND `start`.`record` = 'Report Begin'
AND `end`.`record` = 'Report End'
LIMIT 1

If there is no end of report then it will not return a result, as you would expect.
Leopoldo A dot Oducado (poducado at comfsm dot fm)
16-Feb-2007 11:50
Here is my function to count the number days, weeks, months, and year. I tried it below 1970 and it works.

<?php
function datecal($date,$return_value)
{
$date = explode("/", $date);
$month_begin = $date[0];
$month_begin_date = $date[1];
$year1 = $date[2];
$month_end = date("n");
$month_end_date = date("j");
$year2 = date("Y");
$days_old = 0;
$years_old = 0;
$months_old = 0;
if(
$month_begin==12)
{
 
$month = 1;
 
$year = $year1+1;
}
else
{
 
$month = $month_begin+1;
 
$year = $year1;
}
$begin_plus_days = cal_days_in_month(CAL_GREGORIAN, $month_begin, $year1) - $month_begin_date;
$end_minus_days = cal_days_in_month(CAL_GREGORIAN, $month_end, $year2) - $month_end_date;
while (
$year <= $year2)
{   
     if(
$year == $year2)
    {
     
$days_old = $days_old + cal_days_in_month(CAL_GREGORIAN, $month, $year);    
      if(
$month < $month_end)
        {
        
$months_old = $months_old + 1;   
        
$month = $month + 1;
        }
          elseif (
$month==$month_end and $month_end_date >= $month_begin_date)
            {
        
$year = $year2+1;   
        }
      else
        {   
        
$year = $year2+1;   
        }
    }
    else
    {
    
$days_old = $days_old + cal_days_in_month(CAL_GREGORIAN, $month, $year);
         if (
$month <= 11)
            {
        
$month = $month + 1;
        
$months_old = $months_old + 1;   
            }
         else
            {
        
$month = 1;
        
$year = $year + 1;
        
$months_old = $months_old + 1;       
            }    
    }
}
$days_old = ($days_old + $begin_plus_days) - $end_minus_days;
if(
$return_value == "d")
  { return
$days_old; }
elseif (
$return_value == "w")
  { return
intval($days_old/7); }
elseif (
$return_value == "m")
  { return
$months_old; }
elseif (
$return_value == "y")
  { return
intval($months_old/12); }
}

echo
datecal("08/13/1975","m");
?>
bgold at matrix-consultants dot com
17-Jan-2007 09:08
When debugging code that stores date/time values in a database, you may find yourself wanting to know the date/time that corresponds to a given unix timestamp, or the timestamp for a given date & time.

The following script will do the conversion either way.  If you give it a numeric timestamp, it will display the corresponding date and time.  If you give it a date and time (in almost any standard format), it will display the timestamp.

All conversions are done for your locale/time zone.

<?php
       
while (true)
        {
               
// Read a line from standard in.
               
echo "enter time to convert: ";
               
$inline = fgets(STDIN);
               
$inline = trim($inline);
                if (
$inline == "" || $inline == ".")
                        break;

               
// See if the line is a date.
               
$pos = strpos($inline, "/");
                if (
$pos === false) {
                       
// not a date, should be an integer.
                       
$date = date("m/d/Y G:i:s", $inline);
                        echo
"int2date: $inline -> $date\n";
                } else {
                       
$itime = strtotime($inline);
                        echo
"date2int: $inline -> $itime\n";
                }
        }
?>
mikeb at tracersinfo dot com
07-Nov-2006 03:27
Another month late on this, but I would amend alex's post to recommend using gmdate() any time you're trying to represent a "delta time", or your local timezone is likely to interfere.

For example, a five minute difference (300 seconds) would appear as follows in New York:

echo date('z:H:i:s', 300);
// 364:19:05:00

echo gmdate('z:H:i:s', 300);
// 0:00:05:00

Thanks for the 'z', though, Alex.  Up until now, I've always been dividing that out -- hadn't found it in the format list.  :-)
alex dot stevenson at t8design dot com
13-Sep-2006 12:50
A few months late on this, but I just saw cepercival at thatMailThatsHot dot com 's post, and think that it may be a bit easier to just use this as opposed to writing it by hand:

date("z:H:i:s", $endTimestamp - $startTimestamp);

Since the timestamps store seconds from the unix epoch, and the unix epoch occured at the very beginning of a year, you can get away with this.

It gets a little trickier to place the years, but it should work fine if you subtract out the number of years date("Y", 0) returns.  This would naturally require two seperate calls to the date function- one to find the year, and one to find the rest of the information.
cepercival at thatMailThatsHot dot com
11-Jul-2006 08:31
Hopefully this may be useful to someone out there!
I wanted a simple function to give me a duration for phone calls using a start timestamp and end timestamp. After finding an understandable example here http://www.brenlei.com/articles/php/dates/dates4.php i cobbled this together:

<?php
function callDuration($dateTimeBegin,$dateTimeEnd) {
      
     
$dif=$dateTimeEnd - $dateTimeBegin;

     
$hours = floor($dif / 3600);
     
$temp_remainder = $dif - ($hours * 3600);
       
     
$minutes = floor($temp_remainder / 60);
     
$temp_remainder = $temp_remainder - ($minutes * 60);
       
     
$seconds = $temp_remainder;
         
     
// leading zero's - not bothered about hours
     
$min_lead=':';
     if(
$minutes <=9)
       
$min_lead .= '0';
     
$sec_lead=':';
     if(
$seconds <=9)
       
$sec_lead .= '0';
       
 
// difference/duration returned as Hours:Mins:Secs e.g. 01:29:32

 
return $hours.$min_lead.$minutes.$sec_lead.$seconds;
       
       }
?>

obviously it can be easily extended to include days, weeks etc.
Stupidly simple I know but that's how i like it.
andreencinas at yahoo dot com dot br
28-Sep-2005 08:08
<?php
      
//function like dateDiff Microsoft
       //not error in year Bissesto

      
function dateDiff($interval,$dateTimeBegin,$dateTimeEnd) {
        
//Parse about any English textual datetime
         //$dateTimeBegin, $dateTimeEnd

        
$dateTimeBegin=strtotime($dateTimeBegin);
         if(
$dateTimeBegin === -1) {
           return(
"..begin date Invalid");
         }

        
$dateTimeEnd=strtotime($dateTimeEnd);
         if(
$dateTimeEnd === -1) {
           return(
"..end date Invalid");
         }

        
$dif=$dateTimeEnd - $dateTimeBegin;

         switch(
$interval) {
           case
"s"://seconds
              
return($dif);

           case
"n"://minutes
              
return(floor($dif/60)); //60s=1m

          
case "h"://hours
              
return(floor($dif/3600)); //3600s=1h

          
case "d"://days
              
return(floor($dif/86400)); //86400s=1d

          
case "ww"://Week
              
return(floor($dif/604800)); //604800s=1week=1semana

          
case "m": //similar result "m" dateDiff Microsoft
              
$monthBegin=(date("Y",$dateTimeBegin)*12)+
                
date("n",$dateTimeBegin);
              
$monthEnd=(date("Y",$dateTimeEnd)*12)+
                
date("n",$dateTimeEnd);
              
$monthDiff=$monthEnd-$monthBegin;
               return(
$monthDiff);

           case
"yyyy": //similar result "yyyy" dateDiff Microsoft
              
return(date("Y",$dateTimeEnd) - date("Y",$dateTimeBegin));

           default:
               return(
floor($dif/86400)); //86400s=1d
        
}

       }
?>
glashio at xs4all dot nl
27-Sep-2005 03:46
Calculate Sum BusinessDays (Mon till Fri) between two date's :

<?php
function businessdays($begin, $end) {
   
$rbegin = is_string($begin) ? strtotime(strval($begin)) : $begin;
   
$rend = is_string($end) ? strtotime(strval($end)) : $end;
    if (
$rbegin < 0 || $rend < 0)
        return
0;

   
$begin = workday($rbegin, TRUE);
   
$end = workday($rend, FALSE);

    if (
$end < $begin) {
       
$end = $begin;
       
$begin = $end;
    }

   
$difftime = $end - $begin;
   
$diffdays = floor($difftime / (24 * 60 * 60)) + 1;

    if (
$diffdays < 7) {
       
$abegin = getdate($rbegin);
       
$aend = getdate($rend);
        if (
$diffdays == 1 && ($astart['wday'] == 0 || $astart['wday'] == 6) && ($aend['wday'] == 0 || $aend['wday'] == 6))
            return
0;
       
$abegin = getdate($begin);
       
$aend = getdate($end);
       
$weekends = ($aend['wday'] < $abegin['wday']) ? 1 : 0;
    } else
       
$weekends = floor($diffdays / 7);
    return
$diffdays - ($weekends * 2);
}

function
workday($date, $begindate = TRUE) {
   
$adate = getdate($date);
   
$day = 24 * 60 * 60;
    if (
$adate['wday'] == 0) // Sunday
       
$date += $begindate ? $day : -($day * 2);
    elseif (
$adate['wday'] == 6) // Saterday
       
$date += $begindate ? $day * 2 : -$day;
    return
$date;
}
?>
daniel at globalnetstudios dot com
09-Jun-2005 02:49
This dateDiff() function can take in just about any timestamp, including UNIX timestamps and anything that is accepted by strtotime(). It returns an array with the ability to split the result a couple different ways. I built this function to suffice any datediff needs I had. Hope it helps others too.

<?php
 
/********* dateDiff() function **********
   * returns Array of Int values for difference between two dates
   * $date1 > $date2 --> positive integers are returned
   * $date1 < $date2 --> negative integers are returned
   *
   * $split recognizes the following:
   *   'yw' = splits up years, weeks and days (default)
   *   'y'  = splits up years and days
   *   'w'  = splits up weeks and days
   *   'd'  = total days
   *
   * examples:
   *   $dif1 = dateDiff() or dateDiff('yw')
   *   $dif2 = dateDiff('y')
   *   $dif3 = dateDiff('w')
   *   $dif4 = dateDiff('d')
   *
   * assuming dateDiff returned 853 days, the above
   * examples would have a print_r output of:
   *   $dif1 == Array( [y] => 2 [w] => 17 [d] => 4 )
   *   $dif2 == Array( [y] => 2 [d] => 123 )
   *   $dif3 == Array( [w] => 121 [d] => 6 )
   *   $dif4 == Array( [d] => 847 )
   *
   * note: [h] (hours), [m] (minutes), [s] (seconds) are always returned as elements of the Array
   */
 
function dateDiff($dt1, $dt2, $split='yw') {
   
$date1 = (strtotime($dt1) != -1) ? strtotime($dt1) : $dt1;
   
$date2 = (strtotime($dt2) != -1) ? strtotime($dt2) : $dt2;
   
$dtDiff = $date1 - $date2;
   
$totalDays = intval($dtDiff/(24*60*60));
   
$totalSecs = $dtDiff-($totalDays*24*60*60);
   
$dif['h'] = $h = intval($totalSecs/(60*60));
   
$dif['m'] = $m = intval(($totalSecs-($h*60*60))/60);
   
$dif['s'] = $totalSecs-($h*60*60)-($m*60);
   
// set up array as necessary
   
switch($split) {
    case
'yw': # split years-weeks-days
     
$dif['y'] = $y = intval($totalDays/365);
     
$dif['w'] = $w = intval(($totalDays-($y*365))/7);
     
$dif['d'] = $totalDays-($y*365)-($w*7);
      break;
    case
'y': # split years-days
     
$dif['y'] = $y = intval($totalDays/365);
     
$dif['d'] = $totalDays-($y*365);
      break;
    case
'w': # split weeks-days
     
$dif['w'] = $w = intval($totalDays/7);
     
$dif['d'] = $totalDays-($w*7);
      break;
    case
'd': # don't split -- total days
     
$dif['d'] = $totalDays;
      break;
    default:
      die(
"Error in dateDiff(). Unrecognized \$split parameter. Valid values are 'yw', 'y', 'w', 'd'. Default is 'yw'.");
    }
    return
$dif;
  }
?>
mail at completeideas dot com
07-Jun-2005 04:55
For those who are using pre MYSQL 4.1.1, you can use:

TO_DAYS([Date Value 1])-TO_DAYS([Date Value 2])

For the same result as:

DATEDIFF([Date Value 1],[Date Value 2])
mincklerstraat at softhome dot net
11-Oct-2004 04:43
Before you get too advanced using date functions, be sure also to see the calendar functions at http://www.php.net/manual/en/ref.calendar.php .
nickaubert at america's biggest isp dot com
13-Apr-2004 04:13
I ran into an issue using a function that loops through an array of dates where the keys to the array are the Unix timestamp for midnight for each date.  The loop starts at the first timestamp, then incremented by adding 86400 seconds (ie. 60 x 60 x 24).  However, Daylight Saving Time threw off the accuracy of this loop, since certain days have a duration other than 86400 seconds.  I worked around it by adding a couple of lines to force the timestamp to midnight at each interval.

<?php
  $ONE_DAY
= 90000;   // can't use 86400 because some days have one hour more or less
 
for ( $each_timestamp = $start_time ; $each_timestamp <= $end_time ; $each_timestamp +=  $ONE_DAY) {

   
/*  force midnight to compensate for daylight saving time  */
   
$this_timestamp_array = getdate( $each_timestamp );
   
$each_timestamp = mktime ( 0 , 0 , 0 , $this_timestamp_array[mon] , $this_timestamp_array[mday] , $this_timestamp_array[year] );

    
// do some stuff...
 
}
?>
php at sarge dot ch
28-Jan-2004 08:58
Additional thisone here (didn't test it yet but should work :D):

<?php
/**
 * Calculates the Difference between two timestamps
 *
 * @param integer $start_timestamp
 * @param integer $end_timestamp
 * @param integer $unit (default 0)
 * @return string
 * @access public
 */
function dateDifference($start_timestamp,$end_timestamp,$unit= 0){
 
$days_seconds_star= (23 * 56 * 60) + 4.091; // Star Day
 
$days_seconds_sun= 24 * 60 * 60; // Sun Day
 
$difference_seconds= $end_timestamp - $start_timestamp;
  switch(
$unit){
    case
3: // Days
     
$difference_days= round(($difference_seconds / $days_seconds_sun),2);
      return
'approx. '.$difference_hours.' Days';
    case
2: // Hours
     
$difference_hours= round(($difference_seconds / 3600),2);
      return
'approx. '.$difference_hours.' Hours';
    break;
    case
1: // Minutes
     
$difference_minutes= round(($difference_seconds / 60),2);
      return
'approx. '.$difference_minutes.' Minutes';
    break;
    default:
// Seconds
     
if($difference_seconds > 1){
        return
$difference_seconds.' Seconds';
      }
      else{
        return