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

strptime

(PHP 5 >= 5.1.0)

strptime解析由 strftime() 生成的日期/时间

说明

array strptime ( string $date , string $format )

strptime() 返回一个将 date 解析后的数组,如果出错返回 FALSE

月份和星期几的名字以及其它与语种有关的字符串对应于 setlocale()设定的当前区域(LC_TIME)。

参数

datestring

被解析的字符串(例如从 strftime() 返回的)

formatstring

date 所使用的格式(例如同 strftime() 中所使用的相同)。

更多有关格式选项的信息见 strftime() 页面。

返回值

返回一个数组 或者在失败时返回 FALSE

数组中包含以下单元
键名 说明
tm_sec 当前分钟内的秒数(0-61)
tm_min 当前小时内的分钟数(0-59)
tm_hour 午夜起的小时数(0-23)
tm_mday 月份中的第几天(1-31)
tm_mon 自一月起过了几个月(0-11)
tm_year 自 1900 年起过了几年
tm_wday 自星期天起过了几天(0-6)
tm_yday 本年自一月一日起过了多少天(0-365)
unparsed date 中未能通过指定的 format 识别的部分

范例

Example #1 strptime() 例子

<?php
$format 
'%d/%m/%Y %H:%M:%S';
$strf strftime($format);

echo 
"$strf\n";

print_r(strptime($strf$format));
?>

以上例程的输出类似于:

03/10/2004 15:54:19

Array
(
    [tm_sec] => 19
    [tm_min] => 54
    [tm_hour] => 15
    [tm_mday] => 3
    [tm_mon] => 9
    [tm_year] => 104
    [tm_wday] => 0
    [tm_yday] => 276
    [unparsed] =>
)

注释

Note: 此函数未在 Windows 平台下实现。

Note:

Internally, this function calls the strptime() function provided by the system's C library. This function can exhibit noticeably different behaviour across different operating systems. The use of date_parse_from_format(), which does not suffer from these issues, is recommended on PHP 5.3.0 and later.

Note:

"tm_sec" includes any leap seconds (currently upto 2 a year). For more information on leap seconds, see the » Wikipedia article on leap seconds.

Note:

Prior to PHP 5.2.0, this function could return undefined behaviour. Notably, the "tm_sec", "tm_min" and "tm_hour" entries would return undefined values.

参见


Date/Time 函数
在线手册:中文 英文
PHP手册
PHP手册 - N: 解析由 strftime 生成的日期/时间

用户评论:

dice.the.hacker at gmail dot com (26-Jan-2012 06:59)

Faster then using regexp's strptime function implementation for Windows

function strptime($date, $format){
    $format=str_replace('%','',$format);
    $res = date_parse_from_format($format,$date);
    if($res['error_count']) return false;
    return array(
         "tm_sec"  => (int) $res['second'],
         "tm_min"  => (int) $res['minute'],
         "tm_hour" => (int) $res['hour'],
         "tm_mday" => (int) $res['day'],
         "tm_mon"  => (int) $res['month'],
         "tm_year" => (int) $res['year'],
    );
}

131 (21-Apr-2011 08:17)

Another portage for windows (from ex/yks toolkit)
<?php
//  public static
function strptime($date, $format) {
   
$masks = array(
     
'%d' => '(?P<d>[0-9]{2})',
     
'%m' => '(?P<m>[0-9]{2})',
     
'%Y' => '(?P<Y>[0-9]{4})',
     
'%H' => '(?P<H>[0-9]{2})',
     
'%M' => '(?P<M>[0-9]{2})',
     
'%S' => '(?P<S>[0-9]{2})',
    
// usw..
   
);

   
$rexep = "#".strtr(preg_quote($format), $masks)."#";
    if(!
preg_match($rexep, $date, $out))
      return
false;

   
$ret = array(
     
"tm_sec"  => (int) $out['S'],
     
"tm_min"  => (int) $out['M'],
     
"tm_hour" => (int) $out['H'],
     
"tm_mday" => (int) $out['d'],
     
"tm_mon"  => $out['m']?$out['m']-1:0,
     
"tm_year" => $out['Y'] > 1900 ? $out['Y'] - 1900 : 0,
    );
    return
$ret;
  }
?>

Gravis (03-Apr-2009 01:33)

If you are just looking to switch an existing time format into a mysql compatible format(like YYYYMMDDHHMMSS.uuuuuu) you should use STR_TO_DATE.
see: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

However, if you have an old version of mysql (before 4.1), you may want to consider using a regex.  The example below doesnt have seconds because they arent used often if you are ripping data from a web page.  You will probably have to customize this to your needs.

==code== // for 24 hour times
<?php
  $before
= "12/15/2005 15:47";\
 
$after = preg_replace("/([0-9]{2})\/([0-9]{2})\/([0-9]{4}) ([0-9]{2}):([0-9]{2})/", "$3$1$2$4$5", $before)."00.000000";

  echo
"$before\n$after\n";
?>

==output==
  12/15/2005 15:47
  20051215154700.000000

.

If you are unlucky, you will need to be converting to the 24 hour format as well.
==code== // for 12 hour AM/PM times
<?php
  $before
= "12/15/2005 03:47PM";
// note: you can use an anonymous function instead IF you have php 5
 
function convert_time($m) { if($m[6]=="PM") { $m[4]+=12; } return $m[3].$m[1].$m[2].$m[4].$m[5]."00.000000"; }
 
$after = preg_replace_callback("/([0-9]{2})\/([0-9]{2})\/([0-9]{4}) ([0-9]{2}):([0-9]{2})(AM|PM)/", "convert_time", $before);

  echo
"$before\n$after\n";
?>

==output==
  12/15/2005 03:47PM
  20051215154700.000000

Quietust (27-Feb-2009 04:38)

On some systems, particularly those of BSD lineage (such as FreeBSD and MacOS X), the tm_wday and tm_yday fields are only initialized if requested explicitly (that is, if the %a/%A/%u/%w and %j formats are specified), while others such as Linux and Solaris will calculate them automatically.

Altar 2010 (24-Oct-2008 09:45)

If you want to parse a date or a /time in windows env, i re-write strptime function for windows.

I use the same param and i return the same think that the original one.
I use sscanf to parde the string.
Only some format can be parsed (%S, %M, %H, %d, %m, %Y)

See this page (because the function is too big for this notes)
http://sauron.lionel.free.fr/?page=php_lib_strptime

preview :
<?php
/**
 * Parse a time/date generated with strftime().
 *
 * This function is the same as the original one defined by PHP (Linux/Unix only),
 *  but now you can use it on Windows too.
 *  Limitation : Only this format can be parsed %S, %M, %H, %d, %m, %Y
 *
 * @author Lionel SAURON
 * @version 1.0
 * @public
 *
 * @param $sDate(string)    The string to parse (e.g. returned from strftime()).
 * @param $sFormat(string)  The format used in date  (e.g. the same as used in strftime()).
 * @return (array)          Returns an array with the <code>$sDate</code> parsed, or <code>false</code> on error.
 */
if(function_exists("strptime") == false)
{
    function
strptime($sDate, $sFormat)
    {
       
$aResult = array
        (
           
'tm_sec'   => 0,
           
'tm_min'   => 0,
           
'tm_hour'  => 0,
           
'tm_mday'  => 1,
           
'tm_mon'   => 0,
           
'tm_year'  => 0,
           
'tm_wday'  => 0,
           
'tm_yday'  => 0,
           
'unparsed' => $sDate,
        );
       
        while(
$sFormat != "")
        {
           
// ===== Search a %x element, Check the static string before the %x =====
           
$nIdxFound = strpos($sFormat, '%');
            if(
$nIdxFound === false)
            {
               
               
// There is no more format. Check the last static string.
               
$aResult['unparsed'] = ($sFormat == $sDate) ? "" : $sDate;
                break;
            }
       
        .....
        .....
        .....
        .....
       
       
// ===== Create the other value of the result array =====
       
$nParsedDateTimestamp = mktime($aResult['tm_hour'], $aResult['tm_min'], $aResult['tm_sec'],
                               
$aResult['tm_mon'] + 1, $aResult['tm_mday'], $aResult['tm_year'] + 1900);
       
       
// Before PHP 5.1 return -1 when error
       
if(($nParsedDateTimestamp === false)
        ||(
$nParsedDateTimestamp === -1)) return false;
       
       
$aResult['tm_wday'] = (int) strftime("%w", $nParsedDateTimestamp); // Days since Sunday (0-6)
       
$aResult['tm_yday'] = (strftime("%j", $nParsedDateTimestamp) - 1); // Days since January 1 (0-365)

       
return $aResult;
    }
// END of function
   
} // END if(function_exists("strptime") == false)
?>

firefox3107 at gmail dot com (24-Mar-2008 02:44)

For Windows user! It's rather the same as strptime!
It uses the previous function: but call strToTime($date, $format) to strToDate($date, $format) because this name is forgiven!

<?php
function strToDateTime($date, $format) {
    if(!(
$date = strToDate($date, $format))) return;
   
$dateTime = array('sec' => 0, 'min' => 0, 'hour' => 0, 'day' => 0, 'mon' => 0, 'year' => 0, 'timestamp' => 0);
    foreach(
$date as $key => $val) {
        switch(
$key) {
            case
'd':
            case
'j': $dateTime['day'] = intval($val); break;
            case
'D': $dateTime['day'] = intval(date('j', $val)); break;
           
            case
'm':
            case
'n': $dateTime['mon'] = intval($val); break;
            case
'M': $dateTime['mon'] = intval(date('n', $val)); break;
           
            case
'Y': $dateTime['year'] = intval($val); break;
            case
'y': $dateTime['year'] = intval($val)+2000; break;
           
            case
'G':
            case
'g':
            case
'H':
            case
'h': $dateTime['hour'] = intval($val); break;
           
            case
'i': $dateTime['min'] = intval($val); break;
           
            case
's': $dateTime['sec'] = intval($val); break;
        }
    }
   
$dateTime['timestamp'] = mktime($dateTime['hour'], $dateTime['min'], $dateTime['sec'], $dateTime['mon'], $dateTime['day'], $dateTime['year']);
    return
$dateTime;
}
?>

P. (30-Jan-2008 12:19)

If strptime() fails to match all of the format string and therefore an error occurred the function returns NULL.

chad 0x40 herballure 0x2e com (15-Jun-2007 03:00)

The result of strptime() is not affected by the current timezone setting, even though strftime() is. Tested in PHP 5.1.6.

svenr at selfhtml dot org (23-Nov-2006 09:44)

If you need strptime but are restricted to a php version which does not support it (windows or before PHP 5), note that MySQL since Version 4.1.1 offers (almost?) the same functionality with the STR_TO_DATE function.

See http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html

DT <pwadas at gazeta dot pl> (10-Aug-2006 08:55)

<?php
//This turns non-standard but often used "datetime" string
//like '20060810084251' into nice formatted date
//'Thursday, 10 August 2006 08:42:51 CEST'
//note, that strptime returns day of year counting from 0, so
//you need to put 1 as month number to get appropriate
//month for the daycount. for 2006 strptime for unknown
//reason returns 106, so I simply add 1900

$informat = '%Y%m%d%H%M%S';
$outformat '%A, %d %B %Y %T %Z';
$ftime = strptime("20060810084251",$informat);
$unxTimestamp = mktime(
                   
$ftime['tm_hour'],
                   
$ftime['tm_min'],
                   
$ftime['tm_sec'],
                   
1 ,
                   
$ftime['tm_yday'] + 1,
                  
$ftime['tm_year'] + 1900
                
);
//setlocale(LC_TIME,'pl_PL');
echo strftime($outformat , $unxTimestamp );
?>

jojyjob at gmail dot com (13-May-2006 08:18)

/***Finding the days of a week ***/

<?php

$out
= pre(); 
$outpre=nextweek();
$td=date("Y-m-d");
$result = array_reverse($outpre);
//print_r($result);
array_push($result,$td);
$newarray = array_merge($result,$out);

  foreach(
$newarray as $date1){
    echo
$date1;
    echo
"<br>";
 }

//print_r($out);
//print_r($newarray);

function pre() 
{
$monP=0;
$tueP=1;
$wedP=2;
$thuP=3;
$friP=4;
$satP=5;
$sunP=6;
 
$td=date("Y-m-d");  
//echo $td;
$tdname=date("l"); 
  switch(
$tdname)
  {
   case
"Monday":
      
$rep=$monP;
       break;
   case
"Tuesday":
      
$rep=$tueP;
       break;
   case
"Wednesday":
      
$rep=$wedP;
       break;
   case
"Thursday":
      
$rep=$thuP;
       break;
   case
"Friday":
      
$rep=$friP;
       break;
   case
"Saturday":
      
$rep=$satP;      
       break;
   case
"Sunday":
      
$rep=$sunP;      
       break;      
   default:
       echo
"Sorry";      
  }

 
//echo $tdname."<br>";  
//echo $rep;
$datstart =$td/* the starting date */
//$rep = 12;  /* number of future dates to display */
$nod = 1/* number of days in the future to increment the date */
$nom = 0/* number of months in the future to increment the date */
$noy = 0/* number of years in the future to increment the date */
$precon=future_date($datstart,$rep,$nod,$nom,$noy);
return
$precon;
}
function
future_date($datstart,$rep,$nod,$nom,$noy) {
 
$pre = array();
  while (
$rep >= 1) {
   
$datyy=substr($datstart,0,4);
   
$datmm=substr($datstart,5,2);
   
$datdd=substr($datstart,8,2);
   
$fda=$datdd - $nod;
   
$fmo=$datmm - $nom;
   
$fyr=$datyy -$noy;
   
$dat1=date("Y-m-d", mktime(0,0,0,$fmo,$fda,$fyr))."<BR>";
   
array_push($pre,$dat1);
   
//echo $dat1;
   
$datstart=$dat1;
   
$rep--;
  }
  return
$pre;
}

function
nextweek()
{
$monN=6;
$tueN=5;
$wedN=4;
$thuN=3;
$friN=2;
$satN=1;
$sunN=0;

$td=date("Y-m-d");  
$tdname=date("l"); 
  switch(
$tdname)
  {
   case
"Monday":
      
$rep=$monN;
       break;
   case
"Tuesday":
      
$rep=$tueN;
       break;
   case
"Wednesday":
      
$rep=$wedN;
       break;
   case
"Thursday":
      
$rep=$thuN;
       break;
   case
"Friday":
      
$rep=$friN;
       break;
   case
"Saturday":
      
$rep=$satN;      
       break;
   case
"Sunday":
      
$rep=$sunN;      
       break;      
   default:
       echo
"Sorry";      
  }

 
//echo $tdname."<br>";  
//echo $rep;
$datstart =$td/* the starting date */
//$rep = 12;  /* number of future dates to display */
$nod = 1/* number of days in the future to increment the date */
$nom = 0/* number of months in the future to increment the date */
$noy = 0/* number of years in the future to increment the date */

$con = future_date1($datstart,$rep,$nod,$nom,$noy);
return
$con;
}

function
future_date1($datstart,$rep,$nod,$nom,$noy) {
 
$pre = array();
  while (
$rep >= 1) {
   
$datyy=substr($datstart,0,4);
   
$datmm=substr($datstart,5,2);
   
$datdd=substr($datstart,8,2);
   
$fda=$datdd + $nod;
   
$fmo=$datmm + $nom;
   
$fyr=$datyy + $noy;
   
$dat1=date("Y-m-d", mktime(0,0,0,$fmo,$fda,$fyr))."<BR>";
   
array_push($pre,$dat1);
   
//echo $dat1;
   
$datstart=$dat1;
   
$rep--;
  }
  return
$pre;
}

?>

Malte Starostik (27-Mar-2006 06:45)

It says "Parse a time/date generated with strftime()" but that's not entirely correct -- While strptime("2006131", "%Y%W%u") works as expected, strptime("2006131", "%G%V%u") returns false instead of reversing the equivalent - and unambiguous - strftime() usage.  I suspect that's because glibc doesn't support that.  Anyway, this docu page fails to mention that apparently not all format components supported by strftime() can be used with strptime().