Spec-Zone.ru › Yii 1.1

CDateTimeParser

Пакет system.utils
Наследование класс CDateTimeParser
С версии 1.0
Исходный код framework/utils/CDateTimeParser.php
CDateTimeParser преобразует строку даты/времени в метку времени Unix в соответствии с указанным шаблоном.

Распознаются следующие символы шаблона:
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API