文字

Date/Time 函数

Table of Contents

  • checkdate — 验证一个格里高里日期
  • date_add — 别名 DateTime::add
  • date_create_from_format — 别名 DateTime::createFromFormat
  • date_create_immutable_from_format — 别名 DateTimeImmutable::createFromFormat
  • date_create_immutable — 别名 DateTimeImmutable::__construct
  • date_create — 别名 DateTime::__construct
  • 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 — Get info about given date formatted according to the specified format
  • date_parse — Returns associative array with detailed info about given date
  • date_sub — 别名 DateTime::sub
  • date_sun_info — Returns an array with information about sunset/sunrise and twilight begin/end
  • 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 — Returns the timezone name from abbreviation
  • timezone_name_get — 别名 DateTimeZone::getName
  • timezone_offset_get — 别名 DateTimeZone::getOffset
  • timezone_open — 别名 DateTimeZone::__construct
  • timezone_transitions_get — 别名 DateTimeZone::getTransitions
  • timezone_version_get — Gets the version of the timezonedb

用户评论:

[#1] Hans [2011-08-15 00:19:59]

I needed a way to display an announcement on a shopping site, that would warn users that orders placed between a certain date range, would not be shipped until after a certain date.

I created this simple date detection code to display the notice on certain pages. You can just copy the code and save it to a file on the site and include it anywhere you need to perform a function, or display a notice.

<?php


$start = new DateTime('30-07-2011'); // DD-MM-YYYY
$endDate= new DateTime('07-08-2011'); // DD-MM-YYYY
$curdate = new DateTime(date('d-m-Y'));

if (
$start <= $curdate && $curdate <= $endDate) {
    

    
?>


<p><strong><font color="#FF0000">Please Note: Any orders placed between July 30th and August 7th will only be shipped on August 8th. We apologize for any inconvenience and thank you for your order.</font></strong></p>
  <?php  
 
// don't forget this last bit, it ends the if statement!


?>

[#2] luck dot lil dot leprechaun at gmail dot com [2009-05-19 15:53:29]

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.]

[#3] Robb_Bean at gmx dot nospam dot net [2008-03-18 15:47:24]

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

[#4] sagar [2008-02-28 08:53:07]

<?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) * $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(000$smonth$sday$syear);
    
$timestamp['end_timestamp'] =  $timestamp['start_timestamp'] + (60*60*24*7);

    return 
$timestamp;

}    
# function datefromweek
?>

[#5] stoicnluv at gmail dot com [2007-11-05 15:14:33]

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(00$diff_secs11$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.

[#6] venoel at rin dot ru [2007-10-26 03:33:21]

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.

[#7] koch.ro [2007-10-17 12:42:41]

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->assertTrueFALSE !== $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
        
);
    }
}
?>

[#8] aquatakat at telus dot net [2007-09-24 13:25:45]

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);



echo format_duration(3600);



echo format_duration(11111111);



?>

[#9] Darren Edwards [2007-09-06 08:54:57]

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.

[#10] Leopoldo A dot Oducado (poducado at comfsm dot fm) [2007-02-15 19:50:10]

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");
?>

[#11] bgold at matrix-consultants dot com [2007-01-16 17:08:09]

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";
                }
        }
?>

[#12] andreencinas at yahoo dot com dot br [2005-09-28 05:08:40]

<?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
         
}

       }
?>

[#13] glashio at xs4all dot nl [2005-09-27 00:46:37]

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 || $rend 0)
        return 
0;

    
$begin workday($rbeginTRUE);
    
$end workday($rendFALSE);

    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 == && ($astart['wday'] == || $astart['wday'] == 6) && ($aend['wday'] == || $aend['wday'] == 6))
            return 
0;
        
$abegin getdate($begin);
        
$aend getdate($end);
        
$weekends = ($aend['wday'] < $abegin['wday']) ? 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 : -$day;
    return 
$date;
}
?>

[#14] daniel at globalnetstudios dot com [2005-06-08 11:49:50]

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
  

  
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;
  }
?>

[#15] mail at completeideas dot com [2005-06-06 13:55:33]

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])

[#16] mincklerstraat at softhome dot net [2004-10-11 01:43:59]

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 .

[#17] nickaubert at america's biggest isp dot com [2004-04-12 13:13:34]

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) {

    

    
$this_timestamp_array getdate$each_timestamp );
    
$each_timestamp mktime $this_timestamp_array[mon] , $this_timestamp_array[mday] , $this_timestamp_array[year] );

     
// do some stuff...
  
}
?>

[#18] php at sarge dot ch [2004-01-28 04:58:00]

Additional thisone here (didn't test it yet but should work :D):

<?php

function dateDifference($start_timestamp,$end_timestamp,$unit0){
  
$days_seconds_star= (23 56 60) + 4.091// Star Day
  
$days_seconds_sun24 60 60// Sun Day
  
$difference_seconds$end_timestamp $start_timestamp;
  switch(
$unit){
    case 
3// Days
      
$difference_daysround(($difference_seconds $days_seconds_sun),2);
      return 
'approx. '.$difference_hours.' Days';
    case 
2// Hours
      
$difference_hoursround(($difference_seconds 3600),2);
      return 
'approx. '.$difference_hours.' Hours';
    break;
    case 
1// Minutes
      
$difference_minutesround(($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';
      }
  }
}
?>

[#19] php at elmegil dot net [2003-12-20 10:40:35]

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.

[#20] garyc at earthling dot net [2003-03-18 20:08:34]

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
 

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

 

function datefromweek ($y$w$o) {

    
$days = ($w 1) * $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
?>

[#21] brighn (a) yahoo (.) com [2003-01-02 21:46:16]

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
  
  

  
function getlast($mon$year) {
    
$daysinmonth = array(312831303130313130313031);
    
$days $daysinmonth[$mon-1];
    if (
$mon == && ($year 4) == && (($year 100) != ||
    (
$year 400) == 0)) $days++;
    if (
$mon == && ($year 4) == && ($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";
  }
?>

[#22] nightowl at NOS-PA-M dot uk2 dot net [2002-07-30 10:59:15]

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() + (($numdays) * 24*60*60));

    
$week['start'] = $startdate;
    
$week['end'] = $enddate;
    
    return 
$week;
    
}
?>

[#23] php-contrib at i-ps dot nospam dot net [2002-01-30 06:07:38]

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.

[#24] th at definitynet dot com [2001-01-11 11:00:01]

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!

上一篇: 下一篇: