close
今天在處理一個日期比較的問題,發現 DateTime 類別可以進行 1970/01/01 以前的日期比較,不過由於該類別建構式比較嚴格,所以我將他繼承後擴充改寫了一番。
程式碼在下面:
class Zyme_DateTime extends DateTime{
function __construct($時間 = null, $時區 = null){
if ($時間 instanceof DateTime) {
$_時間 = $時間->format('c');
} else if (is_int($時間)) {
$_時間 = '@' . $時間;
} else {
$_時間 = (string)$時間;
}
if (is_null($時區)) {
parent::__construct($_時間);
} else {
$_時區 = self::時區($時區);
parent::__construct($_時間, $_時區);
$this->setTimezone($_時區);
}
}
function parse(){
return date_parse($this->format('c'));
}
function 時戳(){
return (int)$this->format('U');
}
function 凌晨(){
$this->setTime(0,0,0);
return $this;
}
function 午夜(){
$this->setTime(23,59,59);
return $this;
}
static function 時區($時區 = null){
if ($時區 instanceof DateTimeZone) {
return $時區;
} else if (is_null($時區)) {
$_時區 = date_default_timezone_get();
} else if (is_numeric($時區)) {
$_時區 = self::數字時區($時區);
} else {
$_時區 = self::字串時區($時區);
}
return new DateTimeZone($_時區);
}
static protected function 數字時區($時區){
$_時區 = (Zyme_Filter::數字範圍($時區, -12, 12))
? (int)((float)$時區 * 3600)
: (int)$時區;
$_表格 = self::時區位移表格();
$_輸出 = &$_表格[$_時區];
return (isset($_輸出))
? $_輸出
: 'UTC';
}
static protected function 字串時區($時區){
$_表格 = self::時區識別表格();
$_時區 = (string)$時區;
return (isset($_表格[$_時區]))
? $_時區
: 'UTC';
}
static function 時區識別表格(){
static $_時區 = array();
if (0 === count($_時區)) {
$_時區 = array_flip(DateTimeZone::listIdentifiers());
}
return $_時區;
}
static function 時區位移表格(){
static $_時區 = array();
if (0 !== count($_時區)){
return $_時區;
}
$_表格 = DateTimeZone::listAbbreviations();
foreach ($_表格 as $_項目){
foreach ($_項目 as $_內容) {
if (false === isset($_時區[$_內容['offset']])) {
$_時區[$_內容['offset']] = $_內容['timezone_id'];
}
}
}
ksort($_時區);
return $_時區;
}
}
程式碼在下面:
class Zyme_DateTime extends DateTime{
function __construct($時間 = null, $時區 = null){
if ($時間 instanceof DateTime) {
$_時間 = $時間->format('c');
} else if (is_int($時間)) {
$_時間 = '@' . $時間;
} else {
$_時間 = (string)$時間;
}
if (is_null($時區)) {
parent::__construct($_時間);
} else {
$_時區 = self::時區($時區);
parent::__construct($_時間, $_時區);
$this->setTimezone($_時區);
}
}
function parse(){
return date_parse($this->format('c'));
}
function 時戳(){
return (int)$this->format('U');
}
function 凌晨(){
$this->setTime(0,0,0);
return $this;
}
function 午夜(){
$this->setTime(23,59,59);
return $this;
}
static function 時區($時區 = null){
if ($時區 instanceof DateTimeZone) {
return $時區;
} else if (is_null($時區)) {
$_時區 = date_default_timezone_get();
} else if (is_numeric($時區)) {
$_時區 = self::數字時區($時區);
} else {
$_時區 = self::字串時區($時區);
}
return new DateTimeZone($_時區);
}
static protected function 數字時區($時區){
$_時區 = (Zyme_Filter::數字範圍($時區, -12, 12))
? (int)((float)$時區 * 3600)
: (int)$時區;
$_表格 = self::時區位移表格();
$_輸出 = &$_表格[$_時區];
return (isset($_輸出))
? $_輸出
: 'UTC';
}
static protected function 字串時區($時區){
$_表格 = self::時區識別表格();
$_時區 = (string)$時區;
return (isset($_表格[$_時區]))
? $_時區
: 'UTC';
}
static function 時區識別表格(){
static $_時區 = array();
if (0 === count($_時區)) {
$_時區 = array_flip(DateTimeZone::listIdentifiers());
}
return $_時區;
}
static function 時區位移表格(){
static $_時區 = array();
if (0 !== count($_時區)){
return $_時區;
}
$_表格 = DateTimeZone::listAbbreviations();
foreach ($_表格 as $_項目){
foreach ($_項目 as $_內容) {
if (false === isset($_時區[$_內容['offset']])) {
$_時區[$_內容['offset']] = $_內容['timezone_id'];
}
}
}
ksort($_時區);
return $_時區;
}
}
全站熱搜
留言列表