這學期修課的關係,接觸了PHP,
期末的自訂term project剛好需要許多日期時間的計算,
所以就寫了個class(PHP5),也當作是一種練習吧XD
<?php
#
#˙objDate日期時間物件
# P.S.本物件受到unix時間戳的限制,僅可處理1970~2038年的日期。
#
#˙屬性:
# $this->sec 秒 $this->minn 分 $this->hour 時
# $this->day 日 $this->month 月 $this->year 年
# $this->o 時間戳 $this->week 星期幾(0為星期日)
#
#˙方法:
# bool SameAs($interval,$other=null)
# 傳回與$other日期時間是否相同,可比較多項目
# [1]單位-比較單位,可用多項目如用'dw'檢查[日/星期]相同
# [2]被比較-日期時間的文字或此物件,若不填則以此刻為準
#
# float Diff($interval,$other=null)
# 傳回與$other日期時間的正負值差距(日、時、分、星期會有小數點)
# [1]單位-日期時間差距單位,如'd'檢查差幾[日]
# [2]被比較-日期時間的文字或此物件,若不填則以此刻為準
#
# objDate Add($interval,$value)
# 傳回加減後的日期時間
# [1]單位-日期時間差距單位,如'd'則加減幾[日]
# [2]差值-正負整數
#
# objDate SwitchSecond($second=0) 改變(此刻)日期時間的"秒"
# objDate SwitchMinute($minute=0) 改變(此時)日期時間的"分"
# objDate SwitchHour($hour=0) 改變(今天)日期時間的"小時"
# objDate SwitchDay($day=1) 改變(本月)日期時間的"日"
# objDate SwitchMonth($month=1) 改變(今年)日期時間的"月"
# objDate SwitchYear($year) 改變日期時間的"年"
#
# objDate SwitchDate($month=1,$day=1) 改變(今年)日期時間的"月日"
# objDate SwitchWeekDay($weekday=0) 改變(本星期)日期時間的"星期",0=星期日
#
# objDate MonthDayFirst() 傳回本月第一天
# objDate MonthDayLast() 傳回本月最後一天
# objDate YearDayFirst() 傳回今年第一天
# objDate YearDayLast() 傳回今年最後一天
#
# int MonthDays() 傳回本月天數
# int YearDays() 傳回今年天數
#
# str ToDateTime() 傳回日期時間格式(Y-m-d G:i:s)
# str ToDate() 僅傳回日期格式(Y-m-d)
# str ToTime() 僅傳回時間格式(G:i:s)
# str ToGMT() 傳回格林威治時間(Y-m-d H:M:S)
#
# str ToMonthName($fullname=False) 傳回月份名稱
# str ToWeekDayName($fullname=True) 傳回星期名稱
# str ToAMPM($uppercase=True) 傳回上午/下午
#
# str ToFormat($format) 根據傳入的$format傳回指定的日期時間格式
#
#˙使用範例:
# $Birth=new objDate('1983/6/14');//傳入日期
# $Today=new objDate();//傳入值為空或無法辨識則以此刻為準
# echo "<p>我生日是{$Birth},現在已經{$Birth->Diff('y')}歲啦!
# <p>今年生日星期幾?{$Birth->SwitchYear($Today->year)->ToWeekDayName()},
# <p>今年二月有幾天?{$Today->SwitchMonth(2)->MonthDays()},
# <p>GMT和此刻同月同日?{$Today->SameAs('md',$Today->ToGMT())}";
#˙
#
class objDate{
var$sec,$minn,$hour,$day,$week,$month,$year,$o;
function __construct($datetime=null){//建構:設定時間
$this->o=(is_numeric($datetime))?$datetime:strtotime($datetime);//轉換文字
if(!is_numeric($this->o))$this->o=time();//不指定||無法轉換則以此刻為準
$arr=getdate($this->o)
$this->sec=$arr['seconds'];//秒
$this->minn=$arr['minutes'];//分
$this->hour=$arr['hours'];//時
$this->day=$arr['mday'];//日
$this->week=$arr['wday'];//星期
$this->month=$arr['mon'];//月
$this->year=$arr['year'];//年
}
function __toString(){//顯示為文字時
return$this->ToDate();//大部分應用只需日期
}
/*
function __destruct(){//解構
}
function __call($methodname,$arguments){//呼叫不存在方法
}
function __set($propertyname,$value){//賦值未定義變數
}
function __get($propertyname){//取值未定義變數
}
*/
function SameAs($interval,$other=null){//傳回日期時間是否相同,可比較多項目
if(!is_object($other)) $other=new objDate($other);//轉換直接輸入的日期時間
$interval=strtolower($interval);//轉換為小寫
if(False!==strpos($interval,'d'))
if($this->day!=$other->day)return False;//日
if(False!==strpos($interval,'m'))
if($this->month!=$other->month)return False;//月
if(False!==strpos($interval,'y'))
if($this->year!=$other->year)return False;//年
if(False!==strpos($interval,'s'))
if($this->sec!=$other->sec)return False;//秒
if(False!==strpos($interval,'n'))
if($this->minn!=$other->minn)return False;//分
if(False!==strpos($interval,'h'))
if($this->hour!=$other->hour)return False;//時
if(False!==strpos($interval,'w'))
if($this->week!=$other->week)return False;//星期
return True;
}
function Diff($interval,$other=null){//傳回日期時間的差距
if(!is_object($other))$other=new objDate($other);//轉換直接輸入的日期時間
switch(strtolower($interval)){//時距
case'n':return($other->o-$this->o)/60;//分
case'h':return($other->o-$this->o)/3600;//時
case'd':return($other->o-$this->o)/86400;//天
case'm':return($other->year-$this->year)*12+$other->month-$this->month;//月
case'y':return$other->year-$this->year;//年
case'w':return($other->o-$this->o)/604800;//星期
default:return$other->o-$this->o;//秒
}
}
function Add($interval,$value){//傳回加減後的日期時間
switch(strtolower($interval)){//時距
case's':return $this->SwitchSecond($this->sec+$value);//秒
case'n':return $this->SwitchMinute($this->minn+$value);//分
case'h':return $this->SwitchHour($this->hour+$value);//時
case'd':return $this->SwitchDay($this->day+$value);//日
case'm':return $this->SwitchMonth($this->month+$value);//月
case'y':return $this->SwitchYear($this->year+$value);//年
case'w':return $this->SwitchDay($this->day+$value*7);//星期
default:return$this;//不處理
}
}
function SwitchSecond($second=0){//改變日期時間的"秒"
return new objDate(mktime($this->hour,$this->minn,$second,$this->month,
$this->day,$this->year));//秒
}
function SwitchMinute($minute=0){//改變日期時間的"分"
return new objDate(mktime($this->hour,$minute,$this->sec,$this->month,
$this->day,$this->year));//分
}
function SwitchHour($hour=0){//改變日期時間的"小時"
return new objDate(mktime($hour,$this->minn,$this->sec,$this->month,
$this->day,$this->year));//時
}
function SwitchDay($day=1){//改變日期時間的"日"
return new objDate(mktime($this->hour,$this->minn,$this->sec,$this->month,
$day,$this->year));//日
}
function SwitchMonth($month=1){//改變日期時間的"月"
return new objDate(mktime($this->hour,$this->minn,$this->sec,$month,
$this->day,$this->year));//月
}
function SwitchDate($month=1,$day=1){//改變日期時間的"月日"
return new objDate(mktime($this->hour,$this->minn,$this->sec,$month,$day,
$this->year));//月日
}
function SwitchYear($year){//改變日期時間的"年"
return new objDate(mktime($this->hour,$this->minn,$this->sec,$this->month,
$this->day,$year));//年
}
function SwitchWeekDay($weekday=0){//改變日期時間的"星期",0=星期日
return new objDate(mktime($this->hour,$this->minn,$this->sec,$this->month,
$this->day-$this->week+$weekday,$this->year));//日
}
function MonthDayFirst(){//傳回本月第一天
return $this->SwitchDay(1);
}
function MonthDayLast(){//傳回本月最後一天
return $this->SwitchDate($this->month+1,0);
}
function YearDayFirst(){//傳回本年第一天
return $this->SwitchDate(1,1);
}
function YearDayLast(){//傳回本年最後一天
return $this->SwitchDate(12,31);
}
function MonthDays(){//傳回本月天數
return$this->MonthDayLast()->day;
}
function YearDays(){//傳回本年天數
return$this->YearDayLast()->ToFormat('z')+1;
}
function ToDateTime(){//傳回日期時間格式
return$this->ToFormat('Y-m-d G:i:s');
}
function ToDate(){//僅傳回日期格式
return$this->ToFormat('Y-m-d');
}
function ToTime(){//僅傳回時間格式
return$this->ToFormat('G:i:s');
}
function ToGMT(){//傳回格林威治時間
return gmstrftime('%Y-%m-%d %H:%M:%S',$this->o);
}
function ToMonthName($fullname=False){//傳回月份名稱
return$this->ToFormat($fullname?'F':'M');
}
function ToWeekDayName($fullname=True){//傳回星期名稱
return$this->ToFormat($fullname?'l':'D');
}
function ToAMPM($uppercase=True){//傳回上午/下午
return$this->ToFormat($uppercase?'A':'a');
}
function ToFormat($format){//傳回特定格式日期時間
return(date($format,$this->o));
}
}
?>
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.164.11
※ 編輯: l1l 來自: 140.113.164.11 (05/01 13:15)