This is an easily extendable and pretty way to output human-readable date differences such as "1 day 2 hours ago", "6 months ago", "3 years 7 months 14 days 1 hour 4 minutes 16 seconds" etc etc.
Change "$levels = 2;" to whatever you want. A value of 1 will limit to only one number in the result ("3 days ago"). A value of 3 would result in up to three ("3 days 1 hour 2 minutes ago")
It can be used in the following ways:
echo compare_dates($start_date,$end_date);
echo compare_dates($end_date,$start_date);
echo compare_dates($start_date); //end date will be assumed as time();
<?php
function compare_dates($date1, $date2 = time())
{
$blocks = array(
array('name'=>'year','amount' => 60*60*24*365 ),
array('name'=>'month','amount' => 60*60*24*31 ),
array('name'=>'week','amount' => 60*60*24*7 ),
array('name'=>'day','amount' => 60*60*24 ),
array('name'=>'hour','amount' => 60*60 ),
array('name'=>'minute','amount' => 60 ),
array('name'=>'second','amount' => 1 )
);
$diff = abs($date1-$date2);
$levels = 2;
$current_level = 1;
$result = array();
foreach($blocks as $block)
{
if ($current_level > $levels) {break;}
if ($diff/$block['amount'] >= 1)
{
$amount = floor($diff/$block['amount']);
if ($amount>1) {$plural='s';} else {$plural='';}
$result[] = $amount.' '.$block['name'].$plural;
$diff -= $amount*$block['amount'];
$current_level++;
}
}
return implode(' ',$result).' ago';
}
?>
[EDIT BY danbrown AT php DOT net: Contains a bugfix supplied by (jorge AT dontspam DOT com) on 22-OCT-2009.]
日付・時刻 関数
目次
- checkdate — グレゴリオ歴の日付/時刻の妥当性を確認します
- date_add — のエイリアス DateTime::add
- date_create_from_format — DateTime::createFromFormat のエイリアス
- date_create — 新しい DateTime オブジェクトを返す
- date_date_set — のエイリアス DateTime::setDate
- date_default_timezone_get — スクリプト中の日付/時刻関数で使用されるデフォルトタイムゾーンを取得する
- date_default_timezone_set — スクリプト中の日付/時刻関数で使用されるデフォルトタイムゾーンを設定する
- date_diff — DateTime::diff のエイリアス
- date_format — のエイリアス DateTime::format
- date_get_last_errors — DateTime::getLastErrors のエイリアス
- date_interval_create_from_date_string — DateInterval::createFromDateString のエイリアス
- date_interval_format — DateInterval::format のエイリアス
- date_isodate_set — DateTime::setISODate のエイリアス
- date_modify — DateTime::modify のエイリアス
- date_offset_get — DateTime::getOffset のエイリアス
- date_parse_from_format — 指定した日付についての情報を取得する
- date_parse — 指定した日付に関する詳細な情報を連想配列で返す
- date_sub — DateTime::sub のエイリアス
- date_sun_info — 日の出/日の入り時刻と薄明かり (twilight) の開始/終了時刻の情報を含む配列を返す
- date_sunrise — 指定した日付と場所についての日の出時刻を返す
- date_sunset — 指定した日付と場所についての日の入り時刻を返す
- date_time_set — DateTime::setTime のエイリアス
- date_timestamp_get — DateTime::getTimestamp のエイリアス
- date_timestamp_set — DateTime::setTimestamp のエイリアス
- date_timezone_get — DateTime::getTimezone のエイリアス
- date_timezone_set — DateTime::setTimezone のエイリアス
- date — ローカルの日付/時刻を書式化する
- getdate — 日付/時刻情報を取得する
- gettimeofday — 現在の時間を得る
- gmdate — GMT/UTC の日付/時刻を書式化する
- gmmktime — GMT 日付から Unix タイムスタンプを取得する
- gmstrftime — ロケールの設定に基づいて GMT/UTC 時刻/日付をフォーマットする
- idate — ローカルな時刻/日付を整数として整形する
- localtime — ローカルタイムを得る
- microtime — 現在の Unix タイムスタンプをマイクロ秒まで返す
- mktime — 日付を Unix のタイムスタンプとして取得する
- strftime — ロケールの設定に基づいてローカルな日付・時間をフォーマットする
- strptime — strftime が生成した日付/時刻をパースする
- strtotime — 英文形式の日付を Unix タイムスタンプに変換する
- time — 現在の Unix タイムスタンプを返す
- timezone_abbreviations_list — DateTimeZone::listAbbreviations のエイリアス
- timezone_identifiers_list — DateTimeZone::listIdentifiers のエイリアス
- timezone_location_get — DateTimeZone::getLocation のエイリアス
- timezone_name_from_abbr — 略称からタイムゾーン名を返す
- timezone_name_get — DateTimeZone::getName のエイリアス
- timezone_offset_get — DateTimeZone::getOffset のエイリアス
- timezone_open — 新しい DateTimeZone オブジェクトを返す
- timezone_transitions_get — DateTimeZone::getTransitions のエイリアス
- timezone_version_get — timezonedb のバージョンを取得する
日付・時刻 関数
luck dot lil dot leprechaun at gmail dot com
20-May-2009 07:53
20-May-2009 07:53
Robb_Bean at gmx dot nospam dot net
19-Mar-2008 08:47
19-Mar-2008 08: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 01:53
29-Feb-2008 01: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 09:56
05-Feb-2008 09: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 08:14
06-Nov-2007 08: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 07:33
26-Oct-2007 07: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 04:42
18-Oct-2007 04: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
);
}
}
?>
aquatakat at telus dot net
25-Sep-2007 05:25
25-Sep-2007 05: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
07-Sep-2007 12:54
07-Sep-2007 12: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 12:50
16-Feb-2007 12: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 10:08
17-Jan-2007 10: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";
}
}
?>
andreencinas at yahoo dot com dot br
28-Sep-2005 09:08
28-Sep-2005 09: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 04:46
27-Sep-2005 04: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 03:49
09-Jun-2005 03: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 05:55
07-Jun-2005 05: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 05:43
11-Oct-2004 05: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 05:13
13-Apr-2004 05: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 09:58
28-Jan-2004 09: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 $difference_seconds.' Second';
}
}
}
?>
php at elmegil dot net
21-Dec-2003 03:40
21-Dec-2003 03:40
A much easier way to do days diff is to use Julian Days from the Calendar functions:
$start = gregoriantojd($smon, $sday, $syear);
$end = gregoriantojd($emon, $eday, $eyear);
$daysdiff = $end - $start;
You can see the obvious ways to wrap a function around that.
garyc at earthling dot net
19-Mar-2003 01:08
19-Mar-2003 01: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.
Gary
<?php
/* 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
?>
brighn (a) yahoo (.) com
03-Jan-2003 02:46
03-Jan-2003 02: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. =)
<?php
/* 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) {
$mon++;
if ($mon = 13) {
$mon = 1;
$year++;
}
$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";
}
?>
nightowl at NOS-PA-M dot uk2 dot net
31-Jul-2002 02:59
31-Jul-2002 02: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 :
<?php
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;
}
?>
php-contrib at i-ps dot nospam dot net
30-Jan-2002 11:07
30-Jan-2002 11: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.
th at definitynet dot com
12-Jan-2001 04:00
12-Jan-2001 04: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!
teddk at box100 dot com
08-Sep-2000 07:02
08-Sep-2000 07:02
There is an an excellent article by Allan Kent on PHP date/time. The full article can be found at:
http://www.phpbuilder.net/columns/akent20000610.php3
