> YII 类库手册 > CDateFormatter
system.i18n
继承 class CDateFormatter » CComponent
源自 1.0
版本 $Id: CDateFormatter.PHP 2798 2011-01-01 19:29:03Z qiang.xue $
源码
CDateFormatter提供日期/时间本地化功能。

CDateFormatter允许你以本地化方式格式化日期和时间,注意区分大小写。 本地解译语言模式是CDateFormatter的实例。 关联,例如:月份和星期的名字有所不同。 在不同的语言环境下,格式的结果也不相同。 CDateFormatter模式的定义是被认可的。 CLDR.

CDateFormatter支持预定义模式,以及自定义:
  • 该方法formatDateTime()格式日期和时间时,同时使用。 预定义模式其中包括‘full’,‘long’,‘medium' (默认) 和‘short’。
  • 该方法format()格式指定模式的日期和时间。 参见Http://www.unicode.org/reports/tr35/#Date_Format_Patterns 相关模式的详细字符信息。

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__construct() 构造函数。 CDateFormatter
__get() 返回一个属性值、一个事件处理程序列表或一个行为名称。 CComponent
__isset() 检查一个属性是否为null。 CComponent
__set() 设置一个组件的属性值。 CComponent
__unset() 设置一个组件的属性为null。 CComponent
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaLuateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
format() 根据指定模式格式化日期。 CDateFormatter
formatDateTime() 根据预定义模式格式化日期。 CDateFormatter
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
raiseEvent() 发起一个事件。 CComponent

受保护方法

方法 描述 定义在
formatDay() 获取月份的一天。 CDateFormatter
formatDayInMonth() 获取某天是几月的第几个星期几。例如:七月的第二个星期三 CDateFormatter
formatDayInWeek() 获取星期几。 CDateFormatter
formatDayInYear() 获取年的第几天,例如在今年[1-366]中的一天。 CDateFormatter
formatEra() 获取所在年份。传入正数是公历,传入负数是公元前。 CDateFormatter
formatHour12() 获取在12小时格式的小时,即[1-12] CDateFormatter
formatHour24() 获取24小时格式的小时,即[0-23]。 CDateFormatter
formatHourInDay() 获得当前小时[1-24]。 CDateFormatter
formatHourInPeriod() 获取AM/PM格式的时间,例如:[0-11] CDateFormatter
formatMinutes() 获取分钟。 CDateFormatter
formatMonth() 获取月。 CDateFormatter
formatPeriod() 获取AM/PM指示符。中午12时是下午,午夜12时是上午。 CDateFormatter
formatSeconds() 获取秒钟。 CDateFormatter
formatTimeZone() 获取服务器端的时区。 CDateFormatter
formatWeekInMonth() 获取本月第几周。 CDateFormatter
formatWeekInYear() 获得在今年是第几周。 CDateFormatter
formatYear() 获取年。 CDateFormatter
parseFormat() 解析并格式化日期和时间。 CDateFormatter

方法详细

__construct() 方法
public void __construct(mixed $locale)
$locale mixed 区域ID(字符串)或CLocale的实例
public function __construct($locale)
{
    if(
is_string($locale))
        
$this->_locale=CLocale::getInstance($locale);
    else
        
$this->_locale=$locale;
}

构造函数。

format() 方法
public string format(string $pattern, mixed $time)
$pattern string 模式(参见http://www.unicode.org/reports/tr35/#Date_Format_Patterns)
$time mixed UNIX时间戳或strtotime格式的字符串
{return} string 格式化后的日期时间。
public function format($pattern,$time)
{
    if(
is_string($time))
    {
        if(
ctype_digit($time))
            
$time=(int)$time;
        else
            
$time=strtotime($time);
    }
    
$date=CTimestamp::getDate($time,false,false);
    
$tokens=$this->parseFormat($pattern);
    foreach(
$tokens as &$token)
    {
        if(
is_array($token)) // a callback: method name, sub-pattern
            
$token=$this->{$token[0]}($token[1],$date);
    }
    return 
implode('',$tokens);
}

根据指定模式格式化日期。

formatDateTime() 方法
public string formatDateTime(mixed $timestamp, string $dateWidth='medium', string $timeWidth='medium')
$timestamp mixed UNIX时间戳或strtotime格式的字符串
$dateWidth string 日期模式,它可以是 ‘full’,‘long’,‘medium’和‘short’。 如果为空,这将意味着日期部分不会被格式化。
$timeWidth string 时间模式,它可以是‘full’,‘long’,‘medium’和 ‘short’。 如果为空,这将意味着时间部分不会被格式化。
{return} string 格式化后的日期和时间。
public function formatDateTime($timestamp,$dateWidth='medium',$timeWidth='medium')
{
    if(!empty(
$dateWidth))
        
$date=$this->format($this->_locale->getDateFormat($dateWidth),$timestamp);

    if(!empty(
$timeWidth))
        
$time=$this->format($this->_locale->getTimeFormat($timeWidth),$timestamp);

    if(isset(
$date) && isset($time))
    {
        
$dateTimePattern=$this->_locale->getDateTimeFormat();
        return 
strtr($dateTimePattern,array('{0}'=>$time,'{1}'=>$date));
    }
    else if(isset(
$date))
        return 
$date;
    else if(isset(
$time))
        return 
$time;
}

根据预定义模式格式化日期。 在预定义模式的基础上设置日期和时间精度。

formatDay() 方法
protected string formatDay(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 返回月的一天
protected function formatDay($pattern,$date)
{
    
$day=$date['mday'];
    if(
$pattern==='d')
        return 
$day;
    else if(
$pattern==='dd')
        return 
str_pad($day,2,'0',STR_PAD_LEFT);
    else
        throw new 
CException(Yii::t('yii','The pattern for day of the month must be "d" or "dd".'));
}

获取月份的一天。 "d" 非填充,“dd”总是返回两位数的天数,例如:“05”。

formatDayInMonth() 方法
protected integer formatDayInMonth(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} integer 某月的一天
protected function formatDayInMonth($pattern,$date)
{
    if(
$pattern==='F')
        return (int)((
$date['mday']+6)/7);
    else
        throw new 
CException(Yii::t('yii','The pattern for day in month must be "F".'));
}

获取某天是几月的第几个星期几。例如:七月的第二个星期三

参见

  • http://www.unicode.org/reports/tr35/#Date_Format_Patterns
formatDayInWeek() 方法
protected string formatDayInWeek(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 星期几。
protected function formatDayInWeek($pattern,$date)
{
    
$day=$date['wday'];
    switch(
$pattern)
    {
        case 
'E':
        case 
'EE':
        case 
'EEE':
        case 
'eee':
            return 
$this->_locale->getWeekDayName($day,'abbreviated');
        case 
'EEEE':
        case 
'eeee':
            return 
$this->_locale->getWeekDayName($day,'wide');
        case 
'EEEEE':
        case 
'eeeee':
            return 
$this->_locale->getWeekDayName($day,'narrow');
        case 
'e':
        case 
'ee':
        case 
'c':
            return 
$day $day 7;
        case 
'ccc':
            return 
$this->_locale->getWeekDayName($day,'abbreviated',true);
        case 
'cccc':
            return 
$this->_locale->getWeekDayName($day,'wide',true);
        case 
'ccccc':
            return 
$this->_locale->getWeekDayName($day,'narrow',true);
        default:
            throw new 
CException(Yii::t('yii','The pattern for day of the week must be "E", "EE", "EEE", "EEEE", "EEEEE", "e", "ee", "eee", "eeee", "eeeee", "c", "cccc" or "ccccc".'));
    }
}

获取星期几。 "E", "EE", "EEE" 将返回星期缩写名称,例如:“Tues”; "EEEE" 将返回完整的星期名称; "EEEEE" 将返回简写的星期名称,例如:“T”;

参见

  • http://www.unicode.org/reports/tr35/#Date_Format_Patterns
formatDayInYear() 方法
protected integer formatDayInYear(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} integer 小时AM/PM格式。
protected function formatDayInYear($pattern,$date)
{
    
$day=$date['yday'];
    if((
$n=strlen($pattern))<=3)
        return 
str_pad($day,$n,'0',STR_PAD_LEFT);
    else
        throw new 
CException(Yii::t('yii','The pattern for day in year must be "D", "DD" or "DDD".'));
}

获取年的第几天,例如在今年[1-366]中的一天。

formatEra() 方法
protected string formatEra(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 年份
protected function formatEra($pattern,$date)
{
    
$era=$date['year']>0;
    switch(
$pattern)
    {
        case 
'G':
        case 
'GG':
        case 
'GGG':
            return 
$this->_locale->getEraName($era,'abbreviated');
        case 
'GGGG':
            return 
$this->_locale->getEraName($era,'wide');
        case 
'GGGGG':
            return 
$this->_locale->getEraName($era,'narrow');
        default:
            throw new 
CException(Yii::t('yii','The pattern for era must be "G", "GG", "GGG", "GGGG" or "GGGGG".'));
    }
}

获取所在年份。传入正数是公历,传入负数是公元前。

formatHour12() 方法
protected string formatHour12(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 12小时格式的小时。
protected function formatHour12($pattern,$date)
{
    
$hour=$date['hours'];
    
$hour=($hour==12|$hour==0)?12:($hour)%12;
    if(
$pattern==='h')
        return 
$hour;
    else if(
$pattern==='hh')
        return 
str_pad($hour,2,'0',STR_PAD_LEFT);
    else
        throw new 
CException(Yii::t('yii','The pattern for 12 hour format must be "h" or "hh".'));
}

获取在12小时格式的小时,即[1-12] “h”非填充,“hh”将返回两位字符。

formatHour24() 方法
protected string formatHour24(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 24小时格式的小时。
protected function formatHour24($pattern,$date)
{
    
$hour=$date['hours'];
    if(
$pattern==='H')
        return 
$hour;
    else if(
$pattern==='HH')
        return 
str_pad($hour,2,'0',STR_PAD_LEFT);
    else
        throw new 
CException(Yii::t('yii','The pattern for 24 hour format must be "H" or "HH".'));
}

获取24小时格式的小时,即[0-23]。 “H”非填充,“HH”将返回两位字符。

formatHourInDay() 方法
protected integer formatHourInDay(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} integer 时间[1-24]
protected function formatHourInDay($pattern,$date)
{
    
$hour=$date['hours']==0?24:$date['hours'];
    if(
$pattern==='k')
        return 
$hour;
    else if(
$pattern==='kk')
        return 
str_pad($hour,2,'0',STR_PAD_LEFT);
    else
        throw new 
CException(Yii::t('yii','The pattern for hour in day must be "k" or "kk".'));
}

获得当前小时[1-24]。 ‘k’非填充,‘kk’以两个字符填充。

formatHourInPeriod() 方法
protected integer formatHourInPeriod(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} integer 格式化后的AM/PM时间
protected function formatHourInPeriod($pattern,$date)
{
    
$hour=$date['hours']%12;
    if(
$pattern==='K')
        return 
$hour;
    else if(
$pattern==='KK')
        return 
str_pad($hour,2,'0',STR_PAD_LEFT);
    else
        throw new 
CException(Yii::t('yii','The pattern for hour in AM/PM must be "K" or "KK".'));
}

获取AM/PM格式的时间,例如:[0-11] “K”非填充,“KK”将返回2位字符。

formatMinutes() 方法
protected string formatMinutes(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 分钟。
protected function formatMinutes($pattern,$date)
{
    
$minutes=$date['minutes'];
    if(
$pattern==='m')
        return 
$minutes;
    else if(
$pattern==='mm')
        return 
str_pad($minutes,2,'0',STR_PAD_LEFT);
    else
        throw new 
CException(Yii::t('yii','The pattern for minutes must be "m" or "mm".'));
}

获取分钟。 “m”非填充,“mm”将返回2位字符。

formatMonth() 方法
protected string formatMonth(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 返回月份名称
protected function formatMonth($pattern,$date)
{
    
$month=$date['mon'];
    switch(
$pattern)
    {
        case 
'M':
            return 
$month;
        case 
'MM':
            return 
str_pad($month,2,'0',STR_PAD_LEFT);
        case 
'MMM':
            return 
$this->_locale->getMonthName($month,'abbreviated');
        case 
'MMMM':
            return 
$this->_locale->getMonthName($month,'wide');
        case 
'MMMMM':
            return 
$this->_locale->getMonthName($month,'narrow');
        case 
'L':
            return 
$month;
        case 
'LL':
            return 
str_pad($month,2,'0',STR_PAD_LEFT);
        case 
'LLL':
            return 
$this->_locale->getMonthName($month,'abbreviated'true);
        case 
'LLLL':
            return 
$this->_locale->getMonthName($month,'wide'true);
        case 
'LLLLL':
            return 
$this->_locale->getMonthName($month,'narrow'true);
        default:
            throw new 
CException(Yii::t('yii','The pattern for month must be "M", "MM", "MMM", "MMMM", "L", "LL", "LLL" or "LLLL".'));
    }
}

获取月。 "M" 将返回1至12的整数; "MM" 将返回两个数字,如果没有两位以0填充,如:“05”; "MMM" 将返回的缩写月份名称,例如:“Jan”; "MMMM" 将返回的完整月份名称,例如:“January”; "MMMMM" 将返回简写的月份名称,例如:“J”;

formatPeriod() 方法
protected string formatPeriod(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 上午或下午标志符
protected function formatPeriod($pattern,$date)
{
    if(
$pattern==='a')
    {
        if(
intval($date['hours']/12))
            return 
$this->_locale->getPMName();
        else
            return 
$this->_locale->getAMName();
    }
    else
        throw new 
CException(Yii::t('yii','The pattern for AM/PM marker must be "a".'));
}

获取AM/PM指示符。中午12时是下午,午夜12时是上午。

formatSeconds() 方法
protected string formatSeconds(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 秒钟
protected function formatSeconds($pattern,$date)
{
    
$seconds=$date['seconds'];
    if(
$pattern==='s')
        return 
$seconds;
    else if(
$pattern==='ss')
        return 
str_pad($seconds,2,'0',STR_PAD_LEFT);
    else
        throw new 
CException(Yii::t('yii','The pattern for seconds must be "s" or "ss".'));
}

获取秒钟。 “s”非填充,“ss”将返回2位字符。

formatTimeZone() 方法
protected string formatTimeZone(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 时区
protected function formatTimeZone($pattern,$date)
{
    if(
$pattern[0]==='z' || $pattern[0]==='v')
        return @
date('T', @mktime($date['hours'], $date['minutes'], $date['seconds'], $date['mon'], $date['mday'], $date['year']));
    elseif(
$pattern[0]==='Z')
        return @
date('O', @mktime($date['hours'], $date['minutes'], $date['seconds'], $date['mon'], $date['mday'], $date['year']));
    else
        throw new 
CException(Yii::t('yii','The pattern for time zone must be "z" or "v".'));
}

获取服务器端的时区。

formatWeekInMonth() 方法
protected integer formatWeekInMonth(array $pattern, string $date)
$pattern array 模式。
$date string 在CTimestamp::getdate中返回的结果。
{return} integer 本月第几周
protected function formatWeekInMonth($pattern,$date)
{
    if(
$pattern==='W')
        return @
date('W',@mktime(0,0,0,$date['mon'], $date['mday'],$date['year']))-date('W'mktime(0,0,0,$date['mon'],1,$date['year']))+1;
    else
        throw new 
CException(Yii::t('yii','The pattern for week in month must be "W".'));
}

获取本月第几周。

formatWeekInYear() 方法
protected integer formatWeekInYear(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} integer 今年第几周
protected function formatWeekInYear($pattern,$date)
{
    if(
$pattern==='w')
        return @
date('W',@mktime(0,0,0,$date['mon'],$date['mday'],$date['year']));
    else
        throw new 
CException(Yii::t('yii','The pattern for week in year must be "w".'));
}

获得在今年是第几周。

formatYear() 方法
protected string formatYear(string $pattern, array $date)
$pattern string 模式。
$date array 在CTimestamp::getdate中返回的结果。
{return} string 格式化后的年份
protected function formatYear($pattern,$date)
{
    
$year=$date['year'];
    if(
$pattern==='yy')
        return 
str_pad($year%100,2,'0',STR_PAD_LEFT);
    else
        return 
str_pad($year,strlen($pattern),'0',STR_PAD_LEFT);
}

获取年。 "yy" 将返回两位数字的年份。 "y...y" 将前面用0表示,例如:“yyyyy”将产生"02008"和2008年。

parseFormat() 方法
protected array parseFormat(string $pattern)
$pattern string 需要解析的模式
{return} array 标记解析结果
protected function parseFormat($pattern)
{
    static 
$formats=array();  // cache
    
if(isset($formats[$pattern]))
        return 
$formats[$pattern];
    
$tokens=array();
    
$n=strlen($pattern);
    
$isLiteral=false;
    
$literal='';
    for(
$i=0;$i<$n;++$i)
    {
        
$c=$pattern[$i];
        if(
$c==="'")
        {
            if(
$i<$n-&& $pattern[$i+1]==="'")
            {
                
$tokens[]="'";
                
$i++;
            }
            else if(
$isLiteral)
            {
                
$tokens[]=$literal;
                
$literal='';
                
$isLiteral=false;
            }
            else
            {
                
$isLiteral=true;
                
$literal='';
            }
        }
        else if(
$isLiteral)
            
$literal.=$c;
        else
        {
            for(
$j=$i+1;$j<$n;++$j)
            {
                if(
$pattern[$j]!==$c)
                    break;
            }
            
$p=str_repeat($c,$j-$i);
            if(isset(
self::$_formatters[$c]))
                
$tokens[]=array(self::$_formatters[$c],$p);
            else
                
$tokens[]=$p;
            
$i=$j-1;
        }
    }
    if(
$literal!=='')
        
$tokens[]=$literal;

    return 
$formats[$pattern]=$tokens;
}

解析并格式化日期和时间。

上一篇:
下一篇: