Spec-Zone.ru › Yii 1.1

CTimestamp

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

Часть этого класса была адаптирована из библиотеки дат ADOdb библиотеки абстракции ADOdb. Исходный код был выпущен под лицензией BSD и GNU Lesser GPL, с указанием авторских прав: Copyright (c) 2000, 2001, 2002, 2003, 2004 John Lim Все права защищены.

Этот класс предназначен для поддержки временных меток Unix, которые выходят за пределы диапазона 1901-2038 на Unix и 1970-2038 на Windows. За исключением метода getTimestamp, все остальные методы в этом классе могут работать с расширенным диапазоном временных меток. Для метода getTimestamp, поскольку он просто обертка функции http://php.net/manual/en/function.mktime.php, он по-прежнему может быть ограничен диапазоном временных меток на определенных платформах. Для получения дополнительной информации обратитесь к руководству PHP.

Публичные методы

Метод Описание Определён в
formatDate() Форматирует метку времени в строку даты. CTimestamp
get4DigitYear() Возвращает 4-значное представление года. CTimestamp
getDate() Возвращает массив getdate(). CTimestamp
getDayofWeek() Возвращает день недели, 0 = Воскресенье, ... 6=Суббота. CTimestamp
getGMTDiff() Возвращает разницу между местным часовым поясом и GMT. CTimestamp
getTimestamp() Генерирует метку времени. CTimestamp
isLeapYear() Проверяет високосный год, возвращает true, если это високосный год. Без проверки 2-значного года. Также CTimestamp
isValidDate() Проверяет, является ли сочетание года, месяца и дня допустимым. CTimestamp
isValidTime() Проверяет, являются ли час, минута и секунда допустимыми. CTimestamp

Защищённые методы

Метод Описание Определён в
digitCheck() Исправляет 2-значные годы. Работает для любого столетия. CTimestamp

Подробное описание методов

digitCheck() метод

protected static integer digitCheck(integer $y)
$y integer год
{return} integer изменение двухзначного года на многозначный
Исходный код: framework/utils/CTimestamp.php#112 (показать)
protected static function digitCheck($y)
{
    if (
$y < 100){
        
$yr = (integer) date("Y");
        
$century = (integer) ($yr /100);

        if (
$yr%100 > 50) {
            
$c1 = $century + 1;
            
$c0 = $century;
        } else {
            
$c1 = $century;
            
$c0 = $century - 1;
        }
        
$c1 *= 100;
        
// if 2-digit year is less than 30 years in future, set it to this century
        // otherwise if more than 30 years in future, then we set 2-digit year to the prev century.
        
if (($y + $c1) < $yr+30) $y = $y + $c1;
        else 
$y = $y + $c0*100;
    }
    return 
$y;
}

Исправляет 2-значные годы. Работает для любого столетия. Предполагает, что если 2-значное число больше чем на 30 лет в будущем, то предыдущее столетие.

formatDate() метод

public static string formatDate(string $fmt, integer|boolean $d=false, boolean $is_gmt=false)
$fmt string шаблон форматирования
$d integer|boolean метка времени
$is_gmt boolean является ли это временной меткой GMT
{return} string форматированная дата на основе временной метки $d
Исходный код: framework/utils/CTimestamp.php#216 (показать)
public static function formatDate($fmt,$d=false,$is_gmt=false)
{
    if (
$d === false)
        return (
$is_gmt)? @gmdate($fmt): @date($fmt);

    
// check if number in 32-bit signed range
    
if ((abs($d) <= 0x7FFFFFFF))
    {
        
// if windows, must be +ve integer
        
if ($d >= 0)
            return (
$is_gmt)? @gmdate($fmt,$d): @date($fmt,$d);
    }

    
$_day_power = 86400;

    
$arr = self::getDate($d,true,$is_gmt);

    
$year = $arr['year'];
    
$month = $arr['mon'];
    
$day = $arr['mday'];
    
$hour = $arr['hours'];
    
$min = $arr['minutes'];
    
$secs = $arr['seconds'];

    
$max = strlen($fmt);
    
$dates = '';

    
/*
        at this point, we have the following integer vars to manipulate:
        $year, $month, $day, $hour, $min, $secs
    */
    
for ($i=0; $i < $max; $i++)
    {
        switch(
$fmt[$i])
        {
        case 
'T': $dates .= date('T');break;
        
// YEAR
        
case 'L': $dates .= $arr['leap'] ? '1' : '0'; break;
        case 
'r': // Thu, 21 Dec 2000 16:01:07 +0200

            // 4.3.11 uses '04 Jun 2004'
            // 4.3.8 uses  ' 4 Jun 2004'
            
$dates .= gmdate('D',$_day_power*(3+self::getDayOfWeek($year,$month,$day))).', '
                
. ($day<10?'0'.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' ';

            if (
$hour < 10) $dates .= '0'.$hour; else $dates .= $hour;

            if (
$min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min;

            if (
$secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs;

            
$gmt = self::getGMTDiff();
            
$dates .= sprintf(' %s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);
            break;

        case 
'Y': $dates .= $year; break;
        case 
'y': $dates .= substr($year,strlen($year)-2,2); break;
        
// MONTH
        
case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break;
        case 
'Q': $dates .= ($month+3)>>2; break;
        case 
'n': $dates .= $month; break;
        case 
'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break;
        case 
'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break;
        
// DAY
        
case 't': $dates .= $arr['ndays']; break;
        case 
'z': $dates .= $arr['yday']; break;
        case 
'w': $dates .= self::getDayOfWeek($year,$month,$day); break;
        case 
'l': $dates .= gmdate('l',$_day_power*(3+self::getDayOfWeek($year,$month,$day))); break;
        case 
'D': $dates .= gmdate('D',$_day_power*(3+self::getDayOfWeek($year,$month,$day))); break;
        case 
'j': $dates .= $day; break;
        case 
'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break;
        case 
'S':
            
$d10 = $day % 10;
            if (
$d10 == 1) $dates .= 'st';
            elseif (
$d10 == 2 && $day != 12) $dates .= 'nd';
            elseif (
$d10 == 3) $dates .= 'rd';
            else 
$dates .= 'th';
            break;

        
// HOUR
        
case 'Z':
            
$dates .= ($is_gmt) ? 0 : -self::getGMTDiff(); break;
        case 
'O':
            
$gmt = ($is_gmt) ? 0 : self::getGMTDiff();

            
$dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);
            break;

        case 
'H':
            if (
$hour < 10) $dates .= '0'.$hour;
            else 
$dates .= $hour;
            break;
        case 
'h':
            if (
$hour > 12) $hh = $hour - 12;
            else {
                if (
$hour == 0) $hh = '12';
                else 
$hh = $hour;
            }

            if (
$hh < 10) $dates .= '0'.$hh;
            else 
$dates .= $hh;
            break;

        case 
'G':
            
$dates .= $hour;
            break;

        case 
'g':
            if (
$hour > 12) $hh = $hour - 12;
            else {
                if (
$hour == 0) $hh = '12';
                else 
$hh = $hour;
            }
            
$dates .= $hh;
            break;
        
// MINUTES
        
case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break;
        
// SECONDS
        
case 'U': $dates .= $d; break;
        case 
's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break;
        
// AM/PM
        // Note 00:00 to 11:59 is AM, while 12:00 to 23:59 is PM
        
case 'a':
            if (
$hour>=12) $dates .= 'pm';
            else 
$dates .= 'am';
            break;
        case 
'A':
            if (
$hour>=12) $dates .= 'PM';
            else 
$dates .= 'AM';
            break;
        default:
            
$dates .= $fmt[$i]; break;
        
// ESCAPE
        
case "\\":
            
$i++;
            if (
$i < $max) $dates .= $fmt[$i];
            break;
        }
    }
    return 
$dates;
}

Форматирует метку времени в строку даты.

get4DigitYear() метод

public static integer get4DigitYear(integer $y)
$y integer год
{return} integer 4-значное представление года
Исходный код: framework/utils/CTimestamp.php#139 (показать)
public static function get4DigitYear($y)
{
    return 
self::digitCheck($y);
}

Возвращает 4-значное представление года.

getDate() метод

public static array getDate(integer|boolean $d=false, boolean $fast=false, boolean $gmt=false)
$d integer|boolean исходная временная метка. Ложь, чтобы использовать текущую временную метку.
$fast boolean ложь, чтобы вычислить день недели, по умолчанию истина
$gmt boolean истина, чтобы вычислить даты GMT
{return} array массив с информацией о дате.
Исходный код: framework/utils/CTimestamp.php#163 (показать)
public static function getDate($d=false,$fast=false,$gmt=false)
{
    if(
$d===false)
        
$d=time();
    if(
$gmt)
    {
        
$tz = date_default_timezone_get();
        
date_default_timezone_set('GMT');
        
$result = getdate($d);
        
date_default_timezone_set($tz);
    }
    else
    {
        
$result = getdate($d);
    }
    return 
$result;
}

Возвращает массив getdate().

getDayofWeek() метод

public static integer getDayofWeek(integer $year, integer $month, integer $day)
$year integer год
$month integer месяц
$day integer день
{return} integer день недели
Исходный код: framework/utils/CTimestamp.php#43 (показать)
public static function getDayofWeek($year, $month, $day)
{
    
/*
    Pope Gregory removed 10 days - October 5 to October 14 - from the year 1582 and
    proclaimed that from that time onwards 3 days would be dropped from the calendar
    every 400 years.

    Thursday, October 4, 1582 (Julian) was followed immediately by Friday, October 15, 1582 (Gregorian).
    */
    
if ($year <= 1582)
    {
        if (
$year < 1582 ||
            (
$year == 1582 && ($month < 10 || ($month == 10 && $day < 15))))
        {
            
$greg_correction = 3;
        }
        else
        {
            
$greg_correction = 0;
        }
    }
    else
    {
        
$greg_correction = 0;
    }

    if(
$month > 2)
        
$month -= 2;
    else
    {
        
$month += 10;
        
$year--;
    }

    
$day =  floor((13 * $month - 1) / 5) +
            
$day + ($year % 100) +
            
floor(($year % 100) / 4) +
            
floor(($year / 100) / 4) - 2 *
            
floor($year / 100) + 77 + $greg_correction;

    return 
$day - 7 * floor($day / 7);
}

Возвращает день недели, 0 = Воскресенье, ... 6=Суббота. Алгоритм из PEAR::Date_Calc

getGMTDiff() метод

public static integer getGMTDiff()
{return} integer разница между местным часовым поясом и GMT
Исходный код: framework/utils/CTimestamp.php#147 (показать)
public static function getGMTDiff()
{
    static 
$TZ;
    if (isset(
$TZ)) return $TZ;

    
$TZ = mktime(0,0,0,1,2,1970) - gmmktime(0,0,0,1,2,1970);
    return 
$TZ;
}

getTimestamp() метод

public static integer|float getTimestamp(integer $hr, integer $min, integer $sec, integer|boolean $mon=false, integer|boolean $day=false, integer|boolean $year=false, boolean $is_gmt=false)
$hr integer час
$min integer минута
$sec integer секунда
$mon integer|boolean месяц
$day integer|boolean день
$year integer|boolean год
$is_gmt boolean является ли это временем GMT. Если true, будет использоваться gmmktime().
{return} integer|float временная метка, заданная местным временем.
Исходный код: framework/utils/CTimestamp.php#370 (показать)
public static function getTimestamp($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_gmt=false)
{
    if (
$mon === false)
        return 
$is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec);
    return 
$is_gmt ? @gmmktime($hr,$min,$sec,$mon,$day,$year) : @mktime($hr,$min,$sec,$mon,$day,$year);
}

Генерирует метку времени. Это то же самое, что и функция PHP http://php.net/manual/en/function.mktime.php.

isLeapYear() метод

public static boolean isLeapYear(integer $year)
$year integer год для проверки
{return} boolean истина, если високосный год
Исходный код: framework/utils/CTimestamp.php#92 (показать)
public static function isLeapYear($year)
{
    
$year = self::digitCheck($year);
    if (
$year % 4 != 0)
        return 
false;

    if (
$year % 400 == 0)
        return 
true;
    
// if gregorian calendar (>1582), century not-divisible by 400 is not leap
    
elseif ($year > 1582 && $year % 100 == 0 )
        return 
false;
    return 
true;
}

Проверяет високосный год, возвращает true, если это високосный год. Без проверки 2-значного года. Также правильно обрабатывает юлианский календарь.

isValidDate() метод

public static boolean isValidDate(integer $y, integer $m, integer $d)
$y целое число год
$m целое число месяц
$d целое число день
{return} булево true, если дата корректна, только семантическая проверка.
Исходный код: framework/utils/CTimestamp.php#188 (показать)
public static function isValidDate($y,$m,$d)
{
    return 
checkdate($m, $d, $y);
}

Проверяет, является ли комбинация год, месяц, день корректной.

isValidTime() метод

public static boolean isValidTime(integer $h, integer $m, integer $s, boolean $hs24=true)
$h целое число час
$m целое число минута
$s целое число секунда
$hs24 булево являются ли часы от 0 до 23 (по умолчанию) или от 1 до 12.
{return} булево true, если дата корректна, только семантическая проверка.
Исходный код: framework/utils/CTimestamp.php#201 (показать)
public static function isValidTime($h,$m,$s,$hs24=true)
{
    if(
$hs24 && ($h < 0 || $h > 23) || !$hs24 && ($h < 1 || $h > 12)) return false;
    if(
$m > 59 || $m < 0) return false;
    if(
$s > 59 || $s < 0) return false;
    return 
true;
}

Проверяет, являются ли час, минута и секунда корректными.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CTimestamp

Spec-Zone.ru

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