CDateTimeParser
| Пакет | system.utils |
|---|---|
| Наследование | класс CDateTimeParser |
| С версии | 1.0 |
| Исходный код | framework/utils/CDateTimeParser.php |
CDateTimeParser преобразует строку даты/времени в метку времени Unix в соответствии с указанным шаблоном.
Распознаются следующие символы шаблона:
Например, для разбора строки даты '21/10/2008' используйте следующее:
Локально-зависимые шаблоны, такие как MMM и MMMM, используют CLocale для получения необходимой информации.
Для форматирования метки времени в строку даты используйте CDateFormatter.
Распознаются следующие символы шаблона:
Pattern | Description ---------------------------------------------------- d | Day of month 1 to 31, no padding dd | Day of month 01 to 31, zero leading M | Month digit 1 to 12, no padding MM | Month digit 01 to 12, zero leading MMM | Abbreviation representation of month (available since 1.1.11; locale aware since 1.1.13) MMMM | Full name representation (available since 1.1.13; locale aware) y | 4 year digit, e.g., 2005 (available since 1.1.16) yy | 2 year digit, e.g., 96, 05 yyyy | 4 year digit, e.g., 2005 h | Hour in 0 to 12, no padding hh | Hour in 00 to 12, zero leading H | Hour in 0 to 23, no padding HH | Hour in 00 to 23, zero leading m | Minutes in 0 to 59, no padding mm | Minutes in 00 to 59, zero leading s | Seconds in 0 to 59, no padding ss | Seconds in 00 to 59, zero leading a | AM or PM, case-insensitive (since version 1.1.5) ? | matches any character (wildcard) (since version 1.1.11) ----------------------------------------------------Все остальные символы должны присутствовать в строке даты в соответствующих позициях.
Например, для разбора строки даты '21/10/2008' используйте следующее:
$timestamp=CDateTimeParser::parse('21/10/2008','dd/MM/yyyy');
Локально-зависимые шаблоны, такие как MMM и MMMM, используют CLocale для получения необходимой информации.
Для форматирования метки времени в строку даты используйте CDateFormatter.
Публичные методы
| Метод | Описание | Определено в |
|---|---|---|
| parse() | Преобразует строку даты в метку времени. | CDateTimeParser |
Защищённые методы
| Метод | Описание | Определено в |
|---|---|---|
| parseAmPm() | CDateTimeParser | |
| parseInteger() | CDateTimeParser | |
| parseMonth() | CDateTimeParser |
Подробности методов
parse() метод
public static integer parse(string $value, string $pattern='MM/dd/yyyy', array $defaults=array ( )) | ||
| $value | строка | строка даты для разбора |
| $pattern | строка | шаблон, которому следует строка даты |
| $defaults | массив | значения по умолчанию для года, месяца, дня, часа, минуты и секунды. Значения по умолчанию будут использованы в случае, если шаблон не указывает соответствующие поля. Например, если шаблон — 'MM/dd/yyyy', а этот параметр — array('minute'=>0, 'second'=>0), то фактические значения минут и секунд для результата разбора будут равны 0, а фактическое значение часа будет текущим часом, полученным с помощью date('H'). Этот параметр доступен с версии 1.1.5. |
| {return} | целое число | метка времени для строки даты. Ложь, если разбор не удался. |
Исходный код: framework/utils/CDateTimeParser.php#81 (показать)
public static function parse($value,$pattern='MM/dd/yyyy',$defaults=array())
{
if(self::$_mbstringAvailable===null)
self::$_mbstringAvailable=extension_loaded('mbstring');
$tokens=self::tokenize($pattern);
$i=0;
$n=self::$_mbstringAvailable ? mb_strlen($value,Yii::app()->charset) : strlen($value);
foreach($tokens as $token)
{
switch($token)
{
case 'yyyy':
case 'y':
{
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 'MMMM':
{
$monthName='';
if(($month=self::parseMonth($value,$i,'wide',$monthName))===false)
return false;
$i+=self::$_mbstringAvailable ? mb_strlen($monthName,Yii::app()->charset) : strlen($monthName);
break;
}
case 'MMM':
{
$monthName='';
if(($month=self::parseMonth($value,$i,'abbreviated',$monthName))===false)
return false;
$i+=self::$_mbstringAvailable ? mb_strlen($monthName,Yii::app()->charset) : strlen($monthName);
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;
elseif($hour<12 && $ampm==='pm')
$hour+=12;
}
$i+=2;
break;
}
default:
{
$tn=self::$_mbstringAvailable ? mb_strlen($token,Yii::app()->charset) : strlen($token);
if($i>=$n || ($token{0}!='?' && (self::$_mbstringAvailable ? mb_substr($value,$i,$tn,Yii::app()->charset) : 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 string parseAmPm(string $value, integer $offset) | ||
| $value | строка | строка даты для разбора |
| $offset | целое число | начальный смещение |
| {return} | строка | разборённое значение периода дня |
Исходный код: framework/utils/CDateTimeParser.php#312 (показать)
protected static function parseAmPm($value, $offset)
{
$v=strtolower(self::$_mbstringAvailable ? mb_substr($value,$offset,2,Yii::app()->charset) : substr($value,$offset,2));
return $v==='am' || $v==='pm' ? $v : false;
}
parseInteger() метод
protected static string parseInteger(string $value, integer $offset, integer $minLength, integer $maxLength) | ||
| $value | строка | строка даты для разбора |
| $offset | целое число | начальный смещение |
| $minLength | целое число | минимальная длина |
| $maxLength | целое число | максимальная длина |
| {return} | строка | разборённое целое значение |
Исходный код: framework/utils/CDateTimeParser.php#296 (показать)
protected static function parseInteger($value,$offset,$minLength,$maxLength)
{
for($len=$maxLength;$len>=$minLength;--$len)
{
$v=self::$_mbstringAvailable ? mb_substr($value,$offset,$len,Yii::app()->charset) : substr($value,$offset,$len);
if(ctype_digit($v) && (self::$_mbstringAvailable ? mb_strlen($v,Yii::app()->charset) : strlen($v))>=$minLength)
return $v;
}
return false;
}
parseMonth() метод (доступен с версии v1.1.13)
protected static string parseMonth(string $value, integer $offset, string $width, string &$monthName) | ||
| $value | строка | строка даты для разбора. |
| $offset | целое число | начальный смещение. |
| $width | строка | ширина имени месяца. Может быть 'wide', 'abbreviated' или 'narrow'. |
| $monthName | строка | извлечённое имя месяца. Передаётся по ссылке. |
| {return} | строка | разборённое имя месяца. |
Исходный код: framework/utils/CDateTimeParser.php#326 (показать)
protected static function parseMonth($value,$offset,$width,&$monthName)
{
$valueLength=self::$_mbstringAvailable ? mb_strlen($value,Yii::app()->charset) : strlen($value);
for($len=1; $offset+$len<=$valueLength; $len++)
{
$monthName=self::$_mbstringAvailable ? mb_substr($value,$offset,$len,Yii::app()->charset) : substr($value,$offset,$len);
if(!preg_match('/^[\p{L}\p{M}]+$/u',$monthName)) // unicode aware replacement for ctype_alpha($monthName)
{
$monthName=self::$_mbstringAvailable ? mb_substr($monthName,0,-1,Yii::app()->charset) : substr($monthName,0,-1);
break;
}
}
$monthName=self::$_mbstringAvailable ? mb_strtolower($monthName,Yii::app()->charset) : strtolower($monthName);
$monthNames=Yii::app()->getLocale()->getMonthNames($width,false);
foreach($monthNames as $k=>$v)
$monthNames[$k]=rtrim(self::$_mbstringAvailable ? mb_strtolower($v,Yii::app()->charset) : strtolower($v),'.');
$monthNamesStandAlone=Yii::app()->getLocale()->getMonthNames($width,true);
foreach($monthNamesStandAlone as $k=>$v)
$monthNamesStandAlone[$k]=rtrim(self::$_mbstringAvailable ? mb_strtolower($v,Yii::app()->charset) : strtolower($v),'.');
if(($v=array_search($monthName,$monthNames))===false && ($v=array_search($monthName,$monthNamesStandAlone))===false)
return false;
return $v;
}
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CDateTimeParser