作者l1l (一个好人一个坏人)
标题[心得]分享日期时间处理物件
时间Tue May 1 13:14:16 2007
这学期修课的关系,接触了PHP,
期末的自订term project刚好需要许多日期时间的计算,
所以就写了个class(PHP5),也当作是一种练习吧XD
稍微修改了一些内容,
因为後来领会了class中的属性,
与其用var宣告变数名称,
还不如用阵列来储存更符合PHP的处理方式,
因为就算直接宣告变数名称,
直译的PHP还是需要对变数成员做搜寻的动作。
所以把之前一堆var变数改成$this->_[]阵列来存放。
下载位置:
http://o0o.myweb.hinet.net/php/date.inc.php
<?php
#
#˙objDate日期时间物件 作者:
[email protected]
# P.S.本物件受到unix时间戳的限制,仅可处理1970~2038年的日期。
#
#˙属性:与getdate()函数传回阵列相同
# $this->_['seconds'] 秒
# $this->_['minutes'] 分
# $this->_['hours'] 时
# $this->_['mday'] 日
# $this->_['mon'] 月
# $this->_['year'] 年
# $this->_['yday'] 一年中的天数
# $this->_['wday'] 星期
# $this->_['weekday'] 星期完整名称
# $this->_['month'] 月份完整名称
# $this->_[0] timestamp秒数
#
#˙方法:
# bool SameAs($interval,$that=null)
# 传回与$that日期时间是否相同,可比较多项目
# [1]单位-比较单位,可用多项目如用'dw'检查[日/星期]相同
# [2]被比较-日期时间的文字或此物件,若不填则以此刻为准
#
# float Diff($interval,$that=null)
# 传回与$that日期时间的正负值差距(日、时、分、星期会有小数点)
# [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{
public$_=array();
function __construct($datetime=null){//建构:设定时间
if(!is_numeric($datetime))$datetime=strtotime($datetime);//尝试转换文字
$this->_=(is_numeric($datetime))?getdate($datetime):getdate();//失败?此刻
}
function __toString(){//输出文字
return$this->ToDate();//大部分应用只需日期
}
function SameAs($interval,$that=null){//传回日期时间是否相同,可比较多项目
if(!($that instanceof objDate))$that=new objDate($that);//不同格式则转换
$interval=strtolower($interval);//转换为小写
if(False!==strpos($interval,'d'))
if($this->_['mday']!=$that->_['mday'])return False;//日
if(False!==strpos($interval,'m'))
if($this->_['mon']!=$that->_['mon'])return False;//月
if(False!==strpos($interval,'y'))
if($this->_['year']!=$that->_['year'])return False;//年
if(False!==strpos($interval,'s'))
if($this->_['seconds']!=$that->_['seconds'])return False;//秒
if(False!==strpos($interval,'n'))
if($this->_['minutes']!=$that->_['minutes'])return False;//分
if(False!==strpos($interval,'h'))
if($this->_['hours']!=$that->_['hours'])return False;//时
if(False!==strpos($interval,'w'))
if($this->_['wday']!=$that->_['wday'])return False;//星期
return True;//全部Pass则视为相同
}
function Diff($interval,$that=null){//传回日期时间的差距
if(!($that instanceof objDate))$that=new objDate($that);//不同格式则转换
switch(strtolower($interval)){//时距
case'n':return($that->_[0]-$this->_[0])/60;//分
case'h':return($that->_[0]-$this->_[0])/3600;//时
case'd':return($that->_[0]-$this->_[0])/86400;//天
case'm':return($that->_['year']-$this->_['year'])*12+
$that->_['mon']-$this->_['mon'];//月
case'y':return$that->_['year']-$this->_['year'];//年
case'w':return($that->_[0]-$this->_[0])/604800;//星期
default:return$that->_[0]-$this->_[0];//秒
}
}
function Add($interval,$value){//传回加减後的日期时间
switch(strtolower($interval)){//时距
case's':return$this->SwitchSecond($this->_['seconds']+$value);//秒
case'n':return$this->SwitchMinute($this->_['minutes']+$value);//分
case'h':return$this->SwitchHour($this->_['hours']+$value);//时
case'd':return$this->SwitchDay($this->_['mday']+$value);//日
case'm':return$this->SwitchMonth($this->_['mon']+$value);//月
case'y':return$this->SwitchYear($this->_['year']+$value);//年
case'w':return$this->SwitchDay($this->_['mday']+$value*7);//星期
default:return$this;//不处理
}
}
function SwitchSecond($second=0){//改变日期时间的"秒"
return new objDate(
mktime($this->_['hours'],$this->_['minutes'],$second,
$this->_['mon'],$this->_['mday'],$this->_['year']));//秒
}
function SwitchMinute($minute=0){//改变日期时间的"分"
return new objDate(
mktime($this->_['hours'],$minute,$this->_['seconds'],
$this->_['mon'],$this->_['mday'],$this->_['year']));//分
}
function SwitchHour($hour=0){//改变日期时间的"小时"
return new objDate(
mktime($hour,$this->_['minutes'],$this->_['seconds'],
$this->_['mon'],$this->_['mday'],$this->_['year']));//时
}
function SwitchDay($day=1){//改变日期时间的"日"
return new objDate(
mktime($this->_['hours'],$this->_['minutes'],$this->_['seconds'],
$this->_['mon'],$day,$this->_['year']));//日
}
function SwitchMonth($month=1){//改变日期时间的"月"
return new objDate(
mktime($this->_['hours'],$this->_['minutes'],$this->_['seconds'],
$month,$this->_['mday'],$this->_['year']));//月
}
function SwitchDate($month=1,$day=1){//改变日期时间的"月日"
return new objDate(
mktime($this->_['hours'],$this->_['minutes'],$this->_['seconds'],
$month,$day,$this->_['year']));//月日
}
function SwitchYear($year){//改变日期时间的"年"
return new objDate(
mktime($this->_['hours'],$this->_['minutes'],$this->_['seconds'],
$this->_['mon'],$this->_['mday'],$year));//年
}
function SwitchWeekDay($weekday=0){//改变日期时间的"星期",0=星期日
return new objDate(
mktime($this->_['hours'],$this->_['minutes'],$this->_['seconds'],
$this->_['mon'],$this->_['mday']-$this->_['wday']+$weekday,
$this->_['year']));//星期
}
function MonthDayFirst(){//传回本月第一天
return$this->SwitchDay(1);
}
function MonthDayLast(){//传回本月最後一天
return$this->SwitchDate($this->_['mon']+1,0);
}
function YearDayFirst(){//传回本年第一天
return$this->SwitchDate(1,1);
}
function YearDayLast(){//传回本年最後一天
return$this->SwitchDate(12,31);
}
function MonthDays(){//传回本月天数
return$this->MonthDayLast()->_['mday'];
}
function YearDays(){//传回本年天数
return$this->YearDayLast()->_['yday']+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 ToMonthName($fullname=False){//传回月份名称
return($fullname)?$this->_['month']:$this->ToFormat('M');
}
function ToWeekDayName($fullname=True){//传回星期名称
return($fullname)?$this->_['weekday']:$this->ToFormat('D');
}
function ToAMPM($uppercase=True){//传回上午/下午
return$this->ToFormat($uppercase?'A':'a');
}
function ToFormat($format){//传回特定格式日期时间
return date($format,$this->_[0]);
}
function ToGMT(){//传回格林威治时间
return gmstrftime('%Y-%m-%d %H:%M:%S',$this->_[0]);
}
}
?>
※ 编辑: l1l 来自: 140.113.164.11 (05/07 01:32)
※ 编辑: l1l 来自: 140.113.164.11 (05/09 18:35)