dd

CDateTimeParser


system.utils
继承 class CDateTimeParser
源自 1.0
版本 $Id: CDateTimeParser.php 2928 2011-02-01 17:41:51Z alexander.makarow $
源码
CDateTimeParser按照给定的模式,将一个日期/时间字符串转换为一个UNIX时间戳。

下列模式字符可以被识别:
Pattern |      Description
----------------------------------------------------
d       | 1至31的每月的天数,没有前导零
dd      | 1至31的每月的天数,有前导零
M       | 1至12的月份数,没有前导零
MM      | 1至12的月份数,有前导零
yy      | 2位的年份数,例如:96,05
yyyy    | 4位的年份数,例如:2005
h       | 0至23的小时数,没有前导零
hh      | 0至23的小时数,有前导零
H       | 0至23的小时数,没有前导零
HH      | 0至23的小时数,有前导零
m       | 0至59的分钟数,没有前导零
mm      | 0至59的分钟数,有前导零
s       | 0至59的秒数,没有前导零
ss      | 0至59的秒数,有前导零
a       | AM 或 PM (上午或下午)(从1.1.5版可用)
----------------------------------------------------
其余的所有字符必须出现在日期字符串的对应位置上。

例如,要解析日期字符串“21/10/2008”,可以使用如下格式:
$timestamp=CDateTimeParser::parse('21/10/2008','dd/MM/yyyy');


要格式化一个时间戳为日期字符串,请使用CDateFormatter

公共方法

方法 描述 定义在
parse() 将一个日期字符串转换为时间戳。 CDateTimeParser

受保护方法

方法 描述 定义在
parseAmPm() CDateTimeParser
parseInteger() CDateTimeParser

方法详细

parse() 方法
public static integer parse(string $value, string $pattern='MM/dd/yyyy', array $defaults=array ( ))
$value string 需要解析的日期字符串
$pattern string 日期字符串遵循的模式
$defaults array 年、月、日、小时、分钟、秒的默认值 这些默认值将在模式未明确指定相应的字段时被使用。 例如,如果模式为“MM/dd/yyyy”,而给定的参数为 array('minute'=>0, 'second'=>0),那么实际解析出的结果的分 钟数和秒数的值将为0,而小时数则为使用 date('H') 函数得到的 当时时钟的值。此参数从1.1.5版开始可用。
{return} integer 日期字符串的时间戳。如果解析失败则返回false。
public static function parse($value,$pattern='MM/dd/yyyy',$defaults=array())
{
    
$tokens=self::tokenize($pattern);
    
$i=0;
    
$n=strlen($value);
    foreach(
$tokens as $token)
    {
        switch(
$token)
        {
            case 
'yyyy':
            {
                if((
$year=self::parseInteger($value,$i,4,4))===false)
                    return 
false;
                
$i+=4;
                break;
            }
            case 
'yy':
            {
                if((
$year=self::parseInteger($value,$i,1,2))===false)
                    return 
false;
                
$i+=strlen($year);
                break;
            }
            case 
'MM':
            {
                if((
$month=self::parseInteger($value,$i,2,2))===false)
                    return 
false;
                
$i+=2;
                break;
            }
            case 
'M':
            {
                if((
$month=self::parseInteger($value,$i,1,2))===false)
                    return 
false;
                
$i+=strlen($month);
                break;
            }
            case 
'dd':
            {
                if((
$day=self::parseInteger($value,$i,2,2))===false)
                    return 
false;
                
$i+=2;
                break;
            }
            case 
'd':
            {
                if((
$day=self::parseInteger($value,$i,1,2))===false)
                    return 
false;
                
$i+=strlen($day);
                break;
            }
            case 
'h':
            case 
'H':
            {
                if((
$hour=self::parseInteger($value,$i,1,2))===false)
                    return 
false;
                
$i+=strlen($hour);
                break;
            }
            case 
'hh':
            case 
'HH':
            {
                if((
$hour=self::parseInteger($value,$i,2,2))===false)
                    return 
false;
                
$i+=2;
                break;
            }
            case 
'm':
            {
                if((
$minute=self::parseInteger($value,$i,1,2))===false)
                    return 
false;
                
$i+=strlen($minute);
                break;
            }
            case 
'mm':
            {
                if((
$minute=self::parseInteger($value,$i,2,2))===false)
                    return 
false;
                
$i+=2;
                break;
            }
            case 
's':
            {
                if((
$second=self::parseInteger($value,$i,1,2))===false)
                    return 
false;
                
$i+=strlen($second);
                break;
            }
            case 
'ss':
            {
                if((
$second=self::parseInteger($value,$i,2,2))===false)
                    return 
false;
                
$i+=2;
                break;
            }
            case 
'a':
            {
                if((
$ampm=self::parseAmPm($value,$i))===false)
                    return 
false;
                if(isset(
$hour))
                {
                    if(
$hour==12 && $ampm==='am')
                        
$hour=0;
                    else if(
$hour<12 && $ampm==='pm')
                        
$hour+=12;
                }
                
$i+=2;
                break;
            }
            default:
            {
                
$tn=strlen($token);
                if(
$i>=$n || substr($value,$i,$tn)!==$token)
                    return 
false;
                
$i+=$tn;
                break;
            }
        }
    }
    if(
$i<$n)
        return 
false;

    if(!isset(
$year))
        
$year=isset($defaults['year']) ? $defaults['year'] : date('Y');
    if(!isset(
$month))
        
$month=isset($defaults['month']) ? $defaults['month'] : date('n');
    if(!isset(
$day))
        
$day=isset($defaults['day']) ? $defaults['day'] : date('j');

    if(
strlen($year)===2)
    {
        if(
$year>=70)
            
$year+=1900;
        else
            
$year+=2000;
    }
    
$year=(int)$year;
    
$month=(int)$month;
    
$day=(int)$day;

    if(
        !isset(
$hour) && !isset($minute) && !isset($second)
        && !isset(
$defaults['hour']) && !isset($defaults['minute']) && !isset($defaults['second'])
    )
        
$hour=$minute=$second=0;
    else
    {
        if(!isset(
$hour))
            
$hour=isset($defaults['hour']) ? $defaults['hour'] : date('H');
        if(!isset(
$minute))
            
$minute=isset($defaults['minute']) ? $defaults['minute'] : date('i');
        if(!isset(
$second))
            
$second=isset($defaults['second']) ? $defaults['second'] : date('s');
        
$hour=(int)$hour;
        
$minute=(int)$minute;
        
$second=(int)$second;
    }

    if(
CTimestamp::isValidDate($year,$month,$day) && CTimestamp::isValidTime($hour,$minute,$second))
        return 
CTimestamp::getTimestamp($hour,$minute,$second,$month,$day,$year);
    else
        return 
false;
}

将一个日期字符串转换为时间戳。

parseAmPm() 方法
protected static void parseAmPm($value, $offset)
$value
$offset
protected static function parseAmPm($value$offset)
{
    
$v=strtolower(substr($value,$offset,2));
    return 
$v==='am' || $v==='pm' $v false;
}

parseInteger() 方法
protected static void parseInteger($value, $offset, $minLength, $maxLength)
$value
$offset
$minLength
$maxLength
protected static function parseInteger($value,$offset,$minLength,$maxLength)
{
    for(
$len=$maxLength;$len>=$minLength;--$len)
    {
        
$v=substr($value,$offset,$len);
        if(
ctype_digit($v) && strlen($v)>=$minLength)
            return 
$v;
    }
    return 
false;
}