CDateTimeParser
优质
小牛编辑
138浏览
2023-12-01
所有包 | 方法
CDateTimeParser按照给定的模式,将一个日期/时间字符串转换为一个UNIX时间戳。
下列模式字符可以被识别:
例如,要解析日期字符串“21/10/2008”,可以使用如下格式:
要格式化一个时间戳为日期字符串,请使用CDateFormatter。
源码: framework/utils/CDateTimeParser.php#66 (显示)
源码: framework/utils/CDateTimeParser.php#272 (显示)
源码: framework/utils/CDateTimeParser.php#257 (显示)
包 | system.utils |
---|---|
继承 | class CDateTimeParser |
源自 | 1.0 |
版本 | $Id: CDateTimeParser.php 2928 2011-02-01 17:41:51Z alexander.makarow $ |
源码 | framework/utils/CDateTimeParser.php |
下列模式字符可以被识别:
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。 |
publicstaticfunctionparse($value,$pattern='MM/dd/yyyy',$defaults=array())
{
$tokens=self::tokenize($pattern);
$i=0;
$n=strlen($value);
foreach($tokensas$token)
{
switch($token)
{
case'yyyy':
{
if(($year=self::parseInteger($value,$i,4,4))===false)
returnfalse;
$i+=4;
break;
}
case'yy':
{
if(($year=self::parseInteger($value,$i,1,2))===false)
returnfalse;
$i+=strlen($year);
break;
}
case'MM':
{
if(($month=self::parseInteger($value,$i,2,2))===false)
returnfalse;
$i+=2;
break;
}
case'M':
{
if(($month=self::parseInteger($value,$i,1,2))===false)
returnfalse;
$i+=strlen($month);
break;
}
case'dd':
{
if(($day=self::parseInteger($value,$i,2,2))===false)
returnfalse;
$i+=2;
break;
}
case'd':
{
if(($day=self::parseInteger($value,$i,1,2))===false)
returnfalse;
$i+=strlen($day);
break;
}
case'h':
case'H':
{
if(($hour=self::parseInteger($value,$i,1,2))===false)
returnfalse;
$i+=strlen($hour);
break;
}
case'hh':
case'HH':
{
if(($hour=self::parseInteger($value,$i,2,2))===false)
returnfalse;
$i+=2;
break;
}
case'm':
{
if(($minute=self::parseInteger($value,$i,1,2))===false)
returnfalse;
$i+=strlen($minute);
break;
}
case'mm':
{
if(($minute=self::parseInteger($value,$i,2,2))===false)
returnfalse;
$i+=2;
break;
}
case's':
{
if(($second=self::parseInteger($value,$i,1,2))===false)
returnfalse;
$i+=strlen($second);
break;
}
case'ss':
{
if(($second=self::parseInteger($value,$i,2,2))===false)
returnfalse;
$i+=2;
break;
}
case'a':
{
if(($ampm=self::parseAmPm($value,$i))===false)
returnfalse;
if(isset($hour))
{
if($hour==12&&$ampm==='am')
$hour=0;
elseif($hour<12&&$ampm==='pm')
$hour+=12;
}
$i+=2;
break;
}
default:
{
$tn=strlen($token);
if($i>=$n||substr($value,$i,$tn)!==$token)
returnfalse;
$i+=$tn;
break;
}
}
}
if($i<$n)
returnfalse;
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))
returnCTimestamp::getTimestamp($hour,$minute,$second,$month,$day,$year);
else
returnfalse;
}
将一个日期字符串转换为时间戳。
parseAmPm() 方法protected static void parseAmPm($value, $offset) | ||
$value | ||
$offset |
protectedstaticfunctionparseAmPm($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 |
protectedstaticfunctionparseInteger($value,$offset,$minLength,$maxLength)
{
for($len=$maxLength;$len>=$minLength;--$len)
{
$v=substr($value,$offset,$len);
if(ctype_digit($v)&&strlen($v)>=$minLength)
return$v;
}
returnfalse;
}