本文包含以下內容:
#1、 得到目前的日期和時間-我們有多少種方式?
2、 改變日期顯示的方式-日期和時間的顯示形式
3、 轉換現在的日期為Unix的時間戳記值
4、 改變日期
a. 增加時間
#b . 減去時間
c. 找出兩個日期之間的間隔
5、 為PHP添加DateAdd函數
6、 為PHP添加DateDiff函數
**時間
在Unix中,時間的表示方式為計算從1970年1月1日零時起所過去的秒數,稱為UNIX 時間戳(Unix Epoch)。
如果我們有這樣一段的程式碼:
? echo time(); ?
將回傳值958905820
而此時的時間為2000年5月21日12時43分。
你或許會說這相當不錯。當這對我毫無幫助,或只有一點幫助。在PHP中,對日期處理的函數都必須用到由time()傳回的時間戳記值。同時,由於PHP在Unix和Windows系統中都使用相同的時間戳記值,這就允許你不需要修改程式碼即可在不同的系統間移植。另外的一個好處是time()函數傳回的是一個整數,你可以將其作為整數欄位或文字欄位存入資料庫,而不必使用特別的日期/時間欄位。
你已經基本上了解了Unix的時間戳值,現在讓我們來展示它的實際用途。
改變日期顯示的方式-日期和時間的顯示形式
PHP提供兩個方法來將Unix的時間戳記值轉換成有用的資料。第一個是date()函數。這個函數有兩個參數-第一個字串用來設定你所希望傳回的格式,第二個為Unix的時間戳值。
格式化字串透過一些簡單的特殊格式化字元來顯示你所希望看到的格式的日期和時間。假設你希望日期以這樣的格式顯示「18h01 Sunday 21 May」。
我們需要對字串中的每一部分使用一個特殊格式化字符,你可以從PHP手冊中日期和時間函數庫中找到。這樣的特殊格式化字元數量不少,他們所表示的類似星期幾、月的英文名、用2位或4位數表示的年份,是否是上午(AM)或下午(PM)以及其他。這個例子我們需要的特殊字元為:
'H' -24 小時制的小時
'i'- 分鐘
'l'- 星期幾的英文全名
'd'-本月的第幾天
'F'- 月份的英文全名
因此我們的格式化字串為」Hhi l d F”, PHP代碼為:
? echo date ("Hhi l d F" ,time()); ?
#當我們執行這段程式碼,我們發現我們得到的結果為:
180609 Sunday 21 May
這樣的結果看起來有點奇怪。讓我們再來檢查PHP手冊,原來'h'所代表的是12 小時制的小時數。這再次證明了一句真理:「電腦只做你所告訴它該做的,而不是你想要它做的」。我們有兩個選擇。第一個是在h前使用轉義字元「」:
echo date ("Hhi l d F", time());
我們得到這樣的結果:
18h12 Sunday
我們得到這樣的結果:
18h12 Sunday 21#我們得到這樣的結果:
18h12 Sunday 21#我們得到這樣的結果:
18h12 Sunday 21#我們得到這樣的結果:
18h12 Sunh2121#我們#這正是我們所要的。但如果我們在一個十分複雜的句子中需要包含日期和時間,我們是否需要對每個字元使用轉義字元?
? echo strftime ("%Hh%M %A %d %b" ,time()); ?
结果为:
18h24 Sunday 21 May
这也许看起来将简化繁,但考虑一下如果你所需要的显示的为"Today is Sunday 21 May 2000. The time is somewhere close to 18h24." 我想使用date()函数无疑令人感到厌烦。
在开始的时候,我提及我们有两种方式可以从Unix时间戳值中得到有用的数据。我们刚刚了解了date()和strftime()。另一个getdate()。这个函数只需要Unix 的时间戳值作为参数,而函数的返回值为日期和时间的数组。
下面是一个例子:
? $date_time_array = getdate (time()); echo $date_time_array[ "weekday"]; ?
返回的结果为:
Sunday
除了"weekday",该数组的其他部分为:
"seconds" –秒
"minutes" –分
"hours" –小时
“mday" - 本月的第几天
"wday" -本周的第几天(数字)
"mon" -月(数字)
"year" –年
"yday" - r本年的第几天(数字)
"month" -月份全名
我们现在可以得到容易辨认的日期和时间。那么其他呢?
**转换现在的日期为Unix的时间戳值
通常你必须处理一些日期或时间格式的数据。打开M$的一个Access数据库,所有的日期都以YYYY/MM/DD的格式存储,加入目前的日前即为2000/05/27。Mktime()函数可以将一个时间转换成Unix的时间戳值。
函数的格式为:int mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst] );
从左往右你必须提供小时、分、秒、月、天和年。最后一个参数用于指定你是否处于夏令时,此参数是可选的,所以我们将忽略它。
代码如下:
? echo mktime (0, 0,0 ,5, 27,2000 ); ?
由于不知道小时、分和秒同时这些参数必须填写,我将其设置为0。设置为0意味着时间为午夜。
? $access_date = "2000/05/27"; //explode()函数用一个字符串作为分界来分解另一个字符串。这个例子$access_date通过字符串”/”来分解 $date_elements = explode("/" ,$access_date); // 此时 // $date_elements[0] = 2000 // $date_elements[1] = 5 // $date_elements[2] = 27 echo mktime (0, 0,0 ,$date_elements [1], $date_elements[ 2],$date_elements [0]); ?
我们看一个比从Access数据库单纯获得日期更复杂的情况,我们得到一个以下格式的日期和时间:2000/05/27 02:40:21 PM
? // 来自Access的字符串 $date_time_string = "2000/05/27 02:40:21 PM"; // 将字符串分解成3部分-日期、时间和上午/下午 $dt_elements = explode(" " ,$date_time_string); // 分解日期 $date_elements = explode("/" ,$dt_elements[ 0]); // 分解时间 $time_elements = explode(":" ,$dt_elements[ 1]); // 如果是下午,我们将时间增加12小时以便得到24小时制的时间 if ($dt_elements [2]== "PM") { $time_elements[ 0]+=12;} // 输出结果 echo mktime ($time_elements [0], $time_elements[ 1], $time_elements[ 2], $date_elements[1], $date_elements[2], $date_elements[0]); ?
**修改日期
有时我们需要知道6小时以后是什么时间,35天前的日期或者从你最后一次玩Quake3后已过去多少秒。我们已经知道如何用mktime()函数从单独的日期和时间中获得Unix的时间戳值。如果我们需要的并非目前日期和时间的Unix时间戳值,我们该咋办?下面是一些练习可以帮助说明我们后面所要做的。
正如前面所见,mktime()使用以下参数:小时、分、秒、月、天和年。想想第二节,getdate()函数可以为我们获得这些参数。
? // 将目前的时间戳值放入一数组内 $timestamp = time(); echo $timestamp; echo "p"; $date_time_array = getdate( $timestamp); // 用mktime()函数重新产生Unix时间戳值 $timestamp = mktime($date_time_array ["hours"], $date_time_array["minutes" ],$date_time_array[ "seconds"],$date_time_array ["mon"], $date_time_array["mday" ],$date_time_array[ "year"]); echo $timestamp; ?
看起来有一些令人感到迷惑。我将用一些变量来使上面的程序看起来更容易了解。
? // 将目前的时间戳值放入一数组内 $timestamp = time(); echo $timestamp; echo "p"; $date_time_array = getdate( $timestamp); $hours = $date_time_array[ "hours"]; $minutes = $date_time_array["minutes"]; $seconds = $date_time_array[ "seconds"]; $month = $date_time_array["mon"]; $day = $date_time_array["mday"]; $year = $date_time_array["year"]; // 用mktime()函数重新产生Unix时间戳值 $timestamp = mktime($hours ,$minutes, $seconds,$month ,$day,$year); echo $timestamp; ?
现在我们将由getdate()所产生的时间戳值放入相对应的名称变量中,所以代码变得相对容易阅读和理解。现在如果我们需要在目前的时间上加上19个小时,我们用$hours+19代替mktime()函数中的$hours。mktime()将自动为我们将时间转到第二天。
? // 将目前的时间戳值放入一数组内 $timestamp = time(); echo strftime( "%Hh%M %A %d %b",$timestamp); echo "p"; $date_time_array = getdate($timestamp); $hours = $date_time_array["hours"]; $minutes = $date_time_array["minutes"]; $seconds = $date_time_array["seconds"]; $month = $date_time_array["mon"]; $day = $date_time_array["mday"]; $year = $date_time_array["year"]; // 用mktime()函数重新产生Unix时间戳值 // 增加19小时 $timestamp = mktime($hours + 19, $minutes,$seconds ,$month, $day,$year); echo strftime( "%Hh%M %A %d %b",$timestamp); echo "br~E after adding 19 hours"; ?
运行后得到:
14h58 Saturday 03 Jun
09h58 Sunday 04 Jun
~E after adding 19 hours
减少时间也是同样的-你只需要减少相应变量的值即可。
得到两个不同时间值的差同样也是非常简单。你所需要做的只是将两个时间值转换为Unix的时间戳值,然后两者相减即可。两者之差即为两个时间所相隔的秒数。另外一些算法可以很快地将秒转为天、小时、分和秒。
**为PHP添加DateAdd函数
正如在文章一开始我所说的-写本文的原因是因为我在PHP中找不到类似ASP的DateDiff函数。在介绍完PHP是如何处理日期和时间,让我们将ASP中常用的两个函数移植到PHP。第一个函数是DateAdd。
根据Vbscript的文档,DateAdd(interval,number,date)函数的定义为“返回已添加指定时间间隔的日期。”
Inetrval为表示要添加的时间间隔字符串表达式,例如分或天;number为表示要添加的时间间隔的个数的数值表达式;Date表示日期。
Interval(时间间隔字符串表达式)可以是以下任意值:
yyyy year年
q Quarter季度
m Month月
y Day of year一年的数
d Day天
w Weekday一周的天数
ww Week of year周
h Hour小时
n Minute分
s Second秒
w、y和d的作用是完全一样的,即在目前的日期上加一天,q加3个月,ww加7天。
? function DateAdd ($interval, $number, $date) { $date_time_array = getdate($date); $hours = $date_time_array["hours"]; $minutes = $date_time_array["minutes"]; $seconds = $date_time_array["seconds"]; $month = $date_time_array["mon"]; $day = $date_time_array["mday"]; $year = $date_time_array["year"]; switch ($interval) { case "yyyy": $year +=$number; break; case "q": $month +=($number*3); break; case "m": $month +=$number; break; case "y": case "d": case "w": $day+=$number; break; case "ww": $day+=($number*7); break; case "h": $hours+=$number; break; case "n": $minutes+=$number; break; case "s": $seconds+=$number; break; } $timestamp = mktime($hours ,$minutes, $seconds,$month ,$day, $year); return $timestamp;} ? 我们可以将上面的代码保存为dateadd.inc文件,然后运行以下代码: ? include('dateadd.inc'); $temptime = time(); echo strftime( "%Hh%M %A %d %b",$temptime); $temptime = DateAdd("n" ,50,$temptime); echo "p"; echo strftime( "%Hh%M %A %d %b",$temptime); ?
我们将得到:
15h41 Saturday 03 Jun
16h31 Saturday 03 Jun
为PHP添加DateDiff函数
现在DateAdd已经完成,那么DateDiff呢?
根据文档,DateDiff(interval,date1,date2)函数的定义为“返回两个日期之间的时间间隔”。
Intervals参数的用法与DateAdd函数中的相同。出于避免过于复杂的考虑,我们决定忽略Vbscript中DateDiff函数中其它复杂的参数,即其两个可选的参数变量[firstdayofweek[, firstweekofyear]](它们用于决定星期中第一天是星期天还是星期一和一年中第一周的常数。而且我们只允许intervals有以下五个值:"w"(周)、"d"(天)、"h"(小时)、"n"(分钟) 和"s"(秒)。
Let's see what we can come up with: 下面的代码是我们所需要的:
? Function DateDiff ($interval, $date1,$date2) { // 得到两日期之间间隔的秒数 $timedifference = $date2 - $date1; switch ($interval) { case "w": $retval = bcdiv($timedifference ,604800); break; case "d": $retval = bcdiv( $timedifference,86400); break; case "h": $retval = bcdiv ($timedifference,3600); break; case "n": $retval = bcdiv( $timedifference,60); break; case "s": $retval = $timedifference; break; } return $retval;} ?
将上面的代码存为datediff.inc文件,然后运行下面的代码:
? include('datediff.inc'); include('dateadd.inc'); $currenttime = time(); echo "Current time: ". strftime("%Hh%M %A %d %b" ,$currenttime)."br"; $newtime = DateAdd ("n",50 ,$currenttime); echo "Time plus 50 minutes: ". strftime("%Hh%M %A %d %b" ,$newtime)."br"; $temptime = DateDiff ("n",$currenttime ,$newtime); echo "Interval between two times: ".$temptime; ?
如果一切顺利,你可以看到以下结果:
Current time: 16h23 Saturday 03 Jun
Time plus 50 minutes: 17h13 Saturday 03 Jun
Interval between two times: 50
如果你在Unix机器上运行PHP,你必须编译PHP支持BC高精度函数。你必须从以下地址http://www.php.net/extra/number4.tar.gz下载BC库,然后将其解压到PHP4的根目录下,重新编译PHP,编译时要加上--enable-bcmath的选项。(详细说明见PHP4中README.BCMATH)。PHP4的Windows版本则不需要做任何修补即可直接使用BC高精度函数。
现在你已经得到处理日期和时间的函数,剩下的就是如何将其运用到你的PHP程序中
以上是PHP中的日期處理有哪些方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!