Date/Time 函数
在线手册:中文 英文
PHP手册

getdate

(PHP 4, PHP 5)

getdate取得日期/时间信息

说明

array getdate ([ int $timestamp ] )

返回一个根据 timestamp 得出的包含有日期信息的结合数组。如果没有给出时间戳则认为是当前本地时间。数组中的单元如下:

返回的关联数组中的键名单元
键名 说明 返回值例子
"seconds" 秒的数字表示 059
"minutes" 分钟的数字表示 059
"hours" 小时的数字表示 023
"mday" 月份中第几天的数字表示 131
"wday" 星期中第几天的数字表示 0(表示星期天)到 6(表示星期六)
"mon" 月份的数字表示 112
"year" 4 位数字表示的完整年份 例如:19992003
"yday" 一年中第几天的数字表示 0365
"weekday" 星期几的完整文本表示 SundaySaturday
"month" 月份的完整文本表示 January>December
0 自从 Unix 纪元开始至今的秒数,和 time() 的返回值以及用于 date() 的值类似。 系统相关,典型值为从 -21474836482147483647

Example #1 getdate() 例子

<?php
$today 
getdate();
print_r($today);
?>

以上例程的输出类似于:

Array
(
    [seconds] => 40
    [minutes] => 58
    [hours]   => 21
    [mday]    => 17
    [wday]    => 2
    [mon]     => 6
    [year]    => 2003
    [yday]    => 167
    [weekday] => Tuesday
    [month]   => June
    [0]       => 1055901520
)

参见 date()time()setlocale()

参数

timestamp

可选的 timestamp 参数是一个 integer 的 Unix 时间戳,如未指定,参数值默认为当前本地时间。也就是说,其值默认为 time() 的返回值。

返回值

Returns an associative array of information related to the timestamp. Elements from the returned associative array are as follows:

Key elements of the returned associative array
Key Description Example returned values
"seconds" Numeric representation of seconds 0 to 59
"minutes" Numeric representation of minutes 0 to 59
"hours" Numeric representation of hours 0 to 23
"mday" Numeric representation of the day of the month 1 to 31
"wday" Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday)
"mon" Numeric representation of a month 1 through 12
"year" A full numeric representation of a year, 4 digits Examples: 1999 or 2003
"yday" Numeric representation of the day of the year 0 through 365
"weekday" A full textual representation of the day of the week Sunday through Saturday
"month" A full textual representation of a month, such as January or March January through December
0 Seconds since the Unix Epoch, similar to the values returned by time() and used by date(). System Dependent, typically -2147483648 through 2147483647.

范例

Example #2 getdate() example

<?php
$today 
getdate();
print_r($today);
?>

以上例程的输出类似于:

Array
(
    [seconds] => 40
    [minutes] => 58
    [hours]   => 21
    [mday]    => 17
    [wday]    => 2
    [mon]     => 6
    [year]    => 2003
    [yday]    => 167
    [weekday] => Tuesday
    [month]   => June
    [0]       => 1055901520
)

参见


Date/Time 函数
在线手册:中文 英文
PHP手册
PHP手册 - N: 取得日期/时间信息

用户评论:

moshe at unirgy dot com (08-Sep-2009 12:47)

A function/method to calculate the next workday, taking into account US federal holidays:
<?php
function getNextWorkDayTime($date=null)
{
   
$time = is_string($date) ? strtotime($date) : (is_int($date) ? $date : time());
   
$y = date('Y', $time);
   
// calculate federal holidays
   
$holidays = array();
   
// month/day (jan 1st). iteration/wday/month (3rd monday in january)
   
$hdata = array('1/1'/*newyr*/, '7/4'/*jul4*/, '11/11'/*vet*/, '12/25'/*xmas*/, '3/1/1'/*mlk*/, '3/1/2'/*pres*/, '5/1/5'/*memo*/, '1/1/9'/*labor*/, '2/1/10'/*col*/, '4/4/11'/*thanks*/);
    foreach (
$hdata as $h1) {
       
$h = explode('/', $h1);
        if (
sizeof($h)==2) { // by date
           
$htime = mktime(0, 0, 0, $h[0], $h[1], $y); // time of holiday
           
$w = date('w', $htime); // get weekday of holiday
           
$htime += $w==0 ? 86400 : ($w==6 ? -86400 : 0); // if weekend, adjust
       
} else { // by weekday
           
$htime = mktime(0, 0, 0, $h[2], 1, $y); // get 1st day of month
           
$w = date('w', $htime); // weekday of first day of month
           
$d = 1+($h[1]-$w+7)%7; // get to the 1st weekday
           
for ($t=$htime, $i=1; $i<=$h[0]; $i++, $d+=7) { // iterate to nth weekday
                
$t = mktime(0, 0, 0, $h[2], $d, $y); // get next weekday
                
if (date('n', $t)>$h[2]) break; // check that it's still in the same month
                
$htime = $t; // valid
           
}
        }
       
$holidays[] = $htime; // save the holiday
   
}
    for (
$i=0; $i<5; $i++, $time+=86400) { // 5 days should be enough to get to workday
       
if (in_array(date('w', $time), array(0, 6))) continue; // skip weekends
       
foreach ($holidays as $h) { // iterate through holidays
           
if ($time>=$h && $time<$h+86400) continue 2; // skip holidays
       
}
        break;
// found the workday
   
}
    return
$time;
}
?>


[EDIT BY danbrown AT php DOT net: Contains a bugfix by (yhbeh888 AT yahoo DOT com) on 24-FEB-2010 to address a bug in the "7th line counted from the bottom."]

binupillai2003 at yahoo dot com(Binu V Pillai) (25-Aug-2009 08:32)

<?php
/* Function to find the first and last day of the month from the given date.
*
* Author Binu v Pillai            binupillai2003@yahoo.com
* @Param            String             yyyy-mm-dd
*
*/
function findFirstAndLastDay($anyDate)
{
   
//$anyDate            =    '2009-08-25';    // date format should be yyyy-mm-dd
   
list($yr,$mn,$dt)    =    split('-',$anyDate);    // separate year, month and date
   
$timeStamp            =    mktime(0,0,0,$mn,1,$yr);    //Create time stamp of the first day from the give date.
   
$firstDay            =     date('D',$timeStamp);    //get first day of the given month
   
list($y,$m,$t)        =     split('-',date('Y-m-t',$timeStamp)); //Find the last date of the month and separating it
   
$lastDayTimeStamp    =    mktime(0,0,0,$m,$t,$y);//create time stamp of the last date of the give month
   
$lastDay            =    date('D',$lastDayTimeStamp);// Find last day of the month
   
$arrDay                =    array("$firstDay","$lastDay"); // return the result in an array format.
   
   
return $arrDay;
}

//Usage
$dayArray=array();
$dayArray=findFirstAndLastDay('2009-02-25');
print
$dayArray[0];
print
$dayArray[1];
?>

eric dot schultz at NOSPAM dot CyVon dot com (17-Dec-2008 02:33)

Here is another gmgetdate that is a little faster/suscint (no loops).

<?php
function gmgetdate2($ts = null){
       
$k = array('seconds','minutes','hours','mday',
               
'wday','mon','year','yday','weekday','month',0);
        return(
array_combine($k,split(":",
               
gmdate('s:i:G:j:w:n:Y:z:l:F:U',is_null($ts)?time():$ts))));
        }
?>

It also returns the values in the same order as getdate.

Anonymous (16-Oct-2008 03:01)

I couldn't get the last 2 examples of gmgetdate() to work, so here's a modification that did work for me that behaves exactly like getdate() :

<?php
function gmgetdate($timestamp = null) {
    if (
is_null($timestamp)) { $timestamp = time(); }

   
$dateParts = array(
       
'mday'    => 'j',
       
'wday'    => 'w',
       
'yday'    => 'z',
       
'mon'     => 'n',
       
'year'    => 'Y',
       
'hours'   => 'G',
       
'minutes' => 'i',
       
'seconds' => 's',
       
'weekday' => 'l',
       
'month'   => 'F',
       
0         => 'U'
   
);

    while (list(
$part, $format) = each($dateParts)) {
       
$GMdateParts[$part] = gmdate($format, $timestamp);
    }

    return
$GMdateParts;
}
?>

chris AT cmbuckley DOT co DOT uk (08-Aug-2008 03:08)

For those who want the gmgetdate function that matches the behaviour of getdate:

<?php
function gmgetdate($timestamp = null) {
    if (
is_null($timestamp)) { $timestamp = time(); }

   
$dateParts = array(
       
'mday'    => 'j',
       
'wday'    => 'w',
       
'yday'    => 'z',
       
'mon'     => 'n',
       
'year'    => 'Y',
       
'hours'   => 'G',
       
'minutes' => 'i',
       
'seconds' => 's',
       
'weekday' => 'l',
       
'month'   => 'F',
       
0         => 'U'
   
);

    while (list(,
$value) = each($dateParts)) {
       
$value = gmdate($value, $timestamp);
        if (
is_numeric($value)) { $value = (int)$value; }
    }

    return
$dateParts;
}
?>

timforte at gmail dot com (10-Jan-2008 04:07)

It's worth noting that this is local time, not UTC/GMT - gmgetdate doesn't exist :(.

The most logical way to handle date arithmetic without hitting DST problems is to work in UTC...

<?php
function add_days($my_date,$numdays) {
 
$date_t = strtotime($my_date.' UTC');
  return
gmdate('Y-m-d',$date_t + ($numdays*86400));
}
?>

[it's even faster if you use gmmktime instead of strtotime]

andre at anlex dot co dot za (13-Dec-2006 12:38)

I thought best to show a posseble way to go about bypassing the end month issue where the first day in a new month will have the monday of the week that it falls in - in the old month. Use the numbering of days as the constant and work you way from there.

Example:
<?php
//-----------------------------
$now = time();
$num = date("w");
if (
$num == 0)
{
$sub = 6; }
else {
$sub = ($num-1); }
$WeekMon  = mktime(0, 0, 0, date("m", $now)  , date("d", $now)-$sub, date("Y", $now));    //monday week begin calculation
$todayh = getdate($WeekMon); //monday week begin reconvert

$d = $todayh[mday];
$m = $todayh[mon];
$y = $todayh[year];
echo
"$d-$m-$y"; //getdate converted day

?>

Allot less code makes everyone happy..

Jared Armstrong (10-Dec-2006 06:05)

A nice little function I wrote to determine what number occurrence weekday it is of the month for a given timestamp. (I.e. 2nd Friday, or the 3rd Thursday)

Eg: print_r(getWeekdayOccurrence(mktime(0, 0, 0, 12, 1, 2006)));
Outputs: Array ( [0] => 1 [1] => Friday )  [The first friday]

Eg. print_r(getWeekdayOccurrence(mktime(0, 0, 0, 8, 17, 2009)));
Outputs: Array ( [0] => 3 [1] => Monday ) [The third Monday]

<?php
function getWeekdayOccurrence($time) {
   
$month = intval(date("m", $time)); $day = intval(date("d", $time));
    for (
$i = 0; $i < 7; $i++) {
       
$days[] = date("l", mktime(0, 0, 0, $month, ($i+1), date("Y", $time)));   
    }

   
$posd  = array_search(date("l", $time), $days);
   
$posdm = array_search($days[0], $days) - $posd; /

    return array(((
$day+$posdm+6)/7), $days[$posd]);       
}
?>

cesar at nixar dot org (22-Oct-2006 04:49)

<?php

 
/**
   *  This function is similar to getdate() but it returns
   * the month information.
   *
   *  Returns an associative array containing the month
   * information of the parameters, or the current month
   * if no parameters are given.
   *
   */

 
function getmonth ($month = null, $year = null)
  {
     
// The current month is used if none is supplied.
     
if (is_null($month))
         
$month = date('n');

     
// The current year is used if none is supplied.
     
if (is_null($year))
         
$year = date('Y');

     
// Verifying if the month exist
     
if (!checkdate($month, 1, $year))
          return
null;

     
// Calculating the days of the month
     
$first_of_month = mktime(0, 0, 0, $month, 1, $year);
     
$days_in_month = date('t', $first_of_month);
     
$last_of_month = mktime(0, 0, 0, $month, $days_in_month, $year);

     
$m = array();
     
$m['first_mday'] = 1;
     
$m['first_wday'] = date('w', $first_of_month);
     
$m['first_weekday'] = strftime('%A', $first_of_month);
     
$m['first_yday'] = date('z', $first_of_month);
     
$m['first_week'] = date('W', $first_of_month);
     
$m['last_mday'] = $days_in_month;
     
$m['last_wday'] = date('w', $last_of_month);
     
$m['last_weekday'] = strftime('%A', $last_of_month);
     
$m['last_yday'] = date('z', $last_of_month);
     
$m['last_week'] = date('W', $last_of_month);
     
$m['mon'] = $month;
     
$m['month'] = strftime('%B', $first_of_month);
     
$m['year'] = $year;

      return
$m;
  }

 
// Output
 
print_r(getmonth(11, 1978));
 
print_r(getmonth());

?>

Cas_AT_NUY_DOT_INFO (04-Mar-2006 01:47)

<?php
// This functions calculates the next date only using business days
// 2 parameters, the startdate and the number of businessdays to add
   
function calcduedate($datecalc,$duedays) {
   
$i = 1;
    while (
$i <= $duedays) {
       
$datecalc += 86400; // Add a day.
       
$date_info  = getdate( $datecalc );
        if ((
$date_info["wday"] == 0) or ($date_info["wday"] == 6) )  {
           
$datecalc += 86400; // Add a day.
           
continue;
        }
       
$i++;
    }
    return
$datecalc ;
    }
?>

leo25in at yahoo dot com (11-May-2005 01:17)

getting weekday(actual date) from any give date.

<?php
function cal_date($wday,$tstamp)
{
    return
$tstamp-($wday*(24*3600));
}

function
getweekday($m,$d,$y)
{
   
$tstamp=mktime(0,0,0,$m,$d,$y);
   
   
$Tdate = getdate($tstamp);
   
   
$wday=$Tdate["wday"];
   
    switch(
$wday)
    {
        case
0;
       
$wstamp=cal_date($wday,$tstamp);
       
//echo date("Y-m-d",$wstamp);
       
break;
       
        case
1;
       
$wstamp=cal_date($wday,$tstamp);
       
//echo date("Y-m-d",$wstamp);
       
break;
       
       
        case
2;
       
$wstamp=cal_date($wday,$tstamp);
       
//echo date("Y-m-d",$wstamp);
       
break;
       
        case
3;
       
$wstamp=cal_date($wday,$tstamp);
       
//echo date("Y-m-d",$wstamp);
       
break;
       
        case
4;
       
$wstamp=cal_date($wday,$tstamp);
       
//echo date("Y-m-d",$wstamp);
       
break;
       
        case
5;
       
$wstamp=cal_date($wday,$tstamp);
       
//echo date("Y-m-d",$wstamp);
       
break;
       
        case
6;
       
$wstamp=cal_date($wday,$tstamp);
       
//echo date("Y-m-d",$wstamp);
       
break;
    }
   
   
    
$w["day"]=date("d",$wstamp);
    
$w["month"]=date("m",$wstamp);
    
$w["year"]=date("Y",$wstamp);
    
     return
$w;

}
?>

getisomonday($year, $week) (21-Apr-2004 10:58)

getdate does not convert week numbers. this function relies on strftime to find a timestamp that falls on the monday of specified year and ISO week:

<?php function getisomonday($year, $week) {
       
# check input
       
$year = min ($year, 2038); $year = max ($year, 1970);
       
$week = min ($week, 53); $week = max ($week, 1);
       
# make a guess
       
$monday = mktime (1,1,1,1,7*$week,$year);
       
# count down to week
       
while (strftime('%V', $monday) != $week)
               
$monday -= 60*60*24*7;
       
# count down to monday
       
while (strftime('%u', $monday) != 1)
               
$monday -= 60*60*24;
       
# got it
       
return $monday;
}
?>

Yura Pylypenko (plyrvt at mail dot ru) (15-Sep-2003 02:29)

In addition to canby23 at ms19 post:
It's a very bad idea to consider day having 24 hours (86400 secs), because some days have 23, some - 25 hours due to daylight saving changes. Using of mkdate() and strtotime() is always preferred. strtotime() also has a very nice behaviour of datetime manipulations:
<?php
echo strtotime ("+1 day"), "\n";
echo
strtotime ("+1 week"), "\n";
echo
strtotime ("+1 week 2 days 4 hours 2 seconds"), "\n";
echo
strtotime ("next Thursday"), "\n";
echo
strtotime ("last Monday"), "\n";
?>