Spec-Zone.ru › Yii 1.1
CTimestamp 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
Подробное описание методов 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 лет в будущем, то предыдущее столетие.
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 ; } Форматирует метку времени в строку даты.
public static integer get4DigitYear (integer $y) $y integer год {return} integer 4-значное представление года
Возвращает 4-значное представление года.
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().
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
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 ; } 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.
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-значного года. Также правильно обрабатывает юлианский календарь.
public static boolean isValidDate (integer $y, integer $m, integer $d) $y целое число год $m целое число месяц $d целое число день {return} булево true, если дата корректна, только семантическая проверка.
Проверяет, является ли комбинация год, месяц, день корректной.
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 ; } Проверяет, являются ли час, минута и секунда корректными.