欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP中的日期處理方法集錦

 更新時(shí)間:2007年01月02日 00:00:00   作者:  
在Unix中,時(shí)間的表示方式為計(jì)算從1970年1月1日零時(shí)起所過去的秒數(shù),這稱為UNIX 時(shí)間戳
本文包含以下內(nèi)容: 
1、 得到目前的日期和時(shí)間-我們有多少種方式? 
2、 改變?nèi)掌陲@示的方式-日期和時(shí)間的顯示形式 
3、 轉(zhuǎn)換現(xiàn)在的日期為Unix的時(shí)間戳值 
4、 改變?nèi)掌?nbsp;
a. 增加時(shí)間 
b. 減去時(shí)間 
c. 找出兩日期之間的間隔 
5、 為PHP添加DateAdd函數(shù) 
6、 為PHP添加DateDiff函數(shù) 

**得到目前的日期和時(shí)間 

在Unix中,時(shí)間的表示方式為計(jì)算從1970年1月1日零時(shí)起所過去的秒數(shù),這稱為UNIX 時(shí)間戳(Unix Epoch)。 
如果我們有這樣一段的代碼: 

echo time(); 

將返回值958905820 
而此時(shí)的時(shí)間為2000年5月21日12時(shí)43分。 
你也許會(huì)說這相當(dāng)不錯(cuò)。當(dāng)這對我毫無幫助,或者只有一點(diǎn)幫助。在PHP中,對日期處理的函數(shù)都必須用到由time()返回的時(shí)間戳值。同時(shí),由于PHP在Unix和Windows系統(tǒng)中均使用同樣的時(shí)間戳值,這就允許你不需要修改代碼即可在不同的系統(tǒng)間移植。另外的一個(gè)好處是time()函數(shù)返回的是一個(gè)整數(shù),你可以將其作為整數(shù)字段或文本字段存入數(shù)據(jù)庫,而不必使用特別的日期/時(shí)間字段。 
你已經(jīng)基本了解了Unix的時(shí)間戳值,現(xiàn)在讓我們來展示它的實(shí)際用途。 

改變?nèi)掌陲@示的方式-日期和時(shí)間的顯示形式 

PHP提供兩個(gè)辦法來將Unix的時(shí)間戳值轉(zhuǎn)換成為有用的數(shù)據(jù)。第一個(gè)是date()函數(shù)。這個(gè)函數(shù)有兩個(gè)參數(shù)-第一個(gè)字符串用于設(shè)定你所希望返回的格式,第二個(gè)為Unix的時(shí)間戳值。 
格式化字符串通過一些簡單的特殊格式化字符來顯示你所希望看到的格式的日期和時(shí)間。假設(shè)你希望日期以這樣的格式顯示“18h01 Sunday 21 May”。 
我們需要對字符串中的每一部分使用一個(gè)特殊格式化字符,你可以從PHP手冊中日期和時(shí)間函數(shù)庫中找到。這樣的特殊格式化字符數(shù)量不少,他們所表示的類似于星期幾、月的英文名、用2位或4位數(shù)表示的年份,是否是上午(AM)或下午(PM)以及其他。對于這個(gè)例子我們需要的特殊字符為: 
‘H' -24 小時(shí)制的小時(shí) 
‘i'- 分鐘 
‘l'- 星期幾的英文全名 
‘d'- 本月的第幾日 
‘F'- 月份的英文全名 
因此我們的格式化字符串為”Hhi l d F”, PHP代碼為: 

echo date ("Hhi l d F" ,time()); 

當(dāng)我們執(zhí)行這段代碼,我們發(fā)現(xiàn)我們所得到的結(jié)果為: 
180609 Sunday 21 May 
這樣的結(jié)果看起來有些奇怪。讓我們再查一下PHP手冊,原來'h'所代表的是12 小時(shí)制的小時(shí)數(shù)。這再次證明了一句真理:“計(jì)算機(jī)只做你所告訴它該做的,而不是你想要它做的”。我們有兩個(gè)選擇。第一個(gè)是在h前使用轉(zhuǎn)義字符“”: 
echo date ("Hhi l d F", time()); 
我們得到這樣的結(jié)果: 
18h12 Sunday 21 May 
這正是我們所要的。但如果我們在一個(gè)十分復(fù)雜的句子中需要包含日期和時(shí)間,我們是否需要對每個(gè)字符使用轉(zhuǎn)義字符? 
答案當(dāng)然是不。我們使用另一個(gè)函數(shù)strftime()。 
strftime()有兩個(gè)好處。第一個(gè)好處我們并不在本文討論范圍內(nèi)-如果你使用setlocale()函數(shù),你可以通過strftime得到相應(yīng)語言的月份的名稱。另外的一個(gè)好處是你可以將特別的日期和時(shí)間的格式化字符包含在你的字符串中。這同時(shí)也意味著無論你是否要學(xué)習(xí)date()函數(shù)的所有特殊格式化字符,你都必須學(xué)習(xí)一整套完全不同的格式化字符。 
strftime()工作的方式和date()沒有什么不同,除了特殊格式化字符的前面必須添加一個(gè)百分號%。如果用strftime()函數(shù),前面例子的代碼如下: 

echo strftime ("%Hh%M %A %d %b" ,time()); 

結(jié)果為: 
18h24 Sunday 21 May 
這也許看起來將簡化繁,但考慮一下如果你所需要的顯示的為"Today is Sunday 21 May 2000. The time is somewhere close to 18h24." 我想使用date()函數(shù)無疑令人感到厭煩。 
在開始的時(shí)候,我提及我們有兩種方式可以從Unix時(shí)間戳值中得到有用的數(shù)據(jù)。我們剛剛了解了date()和strftime()。另一個(gè)getdate()。這個(gè)函數(shù)只需要Unix 的時(shí)間戳值作為參數(shù),而函數(shù)的返回值為日期和時(shí)間的數(shù)組。 
下面是一個(gè)例子: 

$date_time_array = getdate (time()); 
echo $date_time_array[ "weekday"]; 

返回的結(jié)果為: 
Sunday 
除了"weekday",該數(shù)組的其他部分為: 
"seconds" –秒 
"minutes" –分 
"hours" –小時(shí) 
“mday" - 本月的第幾天 
"wday" -本周的第幾天(數(shù)字) 
"mon" -月(數(shù)字) 
"year" –年 
"yday" - r本年的第幾天(數(shù)字) 
"month" -月份全名 
我們現(xiàn)在可以得到容易辨認(rèn)的日期和時(shí)間。那么其他呢? 

**轉(zhuǎn)換現(xiàn)在的日期為Unix的時(shí)間戳值 

通常你必須處理一些日期或時(shí)間格式的數(shù)據(jù)。打開M$的一個(gè)Access數(shù)據(jù)庫,所有的日期都以YYYY/MM/DD的格式存儲,加入目前的日前即為2000/05/27。Mktime()函數(shù)可以將一個(gè)時(shí)間轉(zhuǎn)換成Unix的時(shí)間戳值。 
函數(shù)的格式為:int mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst] ); 
從左往右你必須提供小時(shí)、分、秒、月、天和年。最后一個(gè)參數(shù)用于指定你是否處于夏令時(shí),此參數(shù)是可選的,所以我們將忽略它。 
代碼如下: 

echo mktime (0, 0,0 ,5, 27,2000 ); 

由于不知道小時(shí)、分和秒同時(shí)這些參數(shù)必須填寫,我將其設(shè)置為0。設(shè)置為0意味著時(shí)間為午夜。 

$access_date = "2000/05/27"; 
//explode()函數(shù)用一個(gè)字符串作為分界來分解另一個(gè)字符串。這個(gè)例子$access_date通過字符串”/”來分解 
$date_elements = explode("/" ,$access_date); 
// 此時(shí) 
// $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]); 

我們看一個(gè)比從Access數(shù)據(jù)庫單純獲得日期更復(fù)雜的情況,我們得到一個(gè)以下格式的日期和時(shí)間:2000/05/27 02:40:21 PM 

// 來自Access的字符串 
$date_time_string = "2000/05/27 02:40:21 PM"; 
// 將字符串分解成3部分-日期、時(shí)間和上午/下午 
$dt_elements = explode(" " ,$date_time_string); 
// 分解日期 
$date_elements = explode("/" ,$dt_elements[ 0]); 
// 分解時(shí)間 
$time_elements = explode(":" ,$dt_elements[ 1]); 
// 如果是下午,我們將時(shí)間增加12小時(shí)以便得到24小時(shí)制的時(shí)間 
if ($dt_elements [2]== "PM") { $time_elements[ 0]+=12;} 
// 輸出結(jié)果 
echo mktime ($time_elements [0], $time_elements[ 1], $time_elements[ 2], $date_elements[1], $date_elements[2], $date_elements[0]); 


**修改日期 

有時(shí)我們需要知道6小時(shí)以后是什么時(shí)間,35天前的日期或者從你最后一次玩Quake3后已過去多少秒。我們已經(jīng)知道如何用mktime()函數(shù)從單獨(dú)的日期和時(shí)間中獲得Unix的時(shí)間戳值。如果我們需要的并非目前日期和時(shí)間的Unix時(shí)間戳值,我們該咋辦?下面是一些練習(xí)可以幫助說明我們后面所要做的。 
正如前面所見,mktime()使用以下參數(shù):小時(shí)、分、秒、月、天和年。想想第二節(jié),getdate()函數(shù)可以為我們獲得這些參數(shù)。 

// 將目前的時(shí)間戳值放入一數(shù)組內(nèi) 
$timestamp = time(); 
echo $timestamp; 
echo "p"; 
$date_time_array = getdate( $timestamp); 
// 用mktime()函數(shù)重新產(chǎn)生Unix時(shí)間戳值 
$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; 

看起來有一些令人感到迷惑。我將用一些變量來使上面的程序看起來更容易了解。 

// 將目前的時(shí)間戳值放入一數(shù)組內(nèi) 
$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()函數(shù)重新產(chǎn)生Unix時(shí)間戳值 
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day,$year); 
echo $timestamp; 

現(xiàn)在我們將由getdate()所產(chǎn)生的時(shí)間戳值放入相對應(yīng)的名稱變量中,所以代碼變得相對容易閱讀和理解。現(xiàn)在如果我們需要在目前的時(shí)間上加上19個(gè)小時(shí),我們用$hours+19代替mktime()函數(shù)中的$hours。mktime()將自動(dòng)為我們將時(shí)間轉(zhuǎn)到第二天。 

// 將目前的時(shí)間戳值放入一數(shù)組內(nèi) 
$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()函數(shù)重新產(chǎn)生Unix時(shí)間戳值 
// 增加19小時(shí) 
$timestamp = mktime($hours + 19, $minutes,$seconds ,$month, $day,$year); 
echo strftime( "%Hh%M %A %d %b",$timestamp); 
echo "br~E after adding 19 hours"; 

運(yùn)行后得到: 
14h58 Saturday 03 Jun 
09h58 Sunday 04 Jun 
~E after adding 19 hours 
減少時(shí)間也是同樣的-你只需要減少相應(yīng)變量的值即可。 
得到兩個(gè)不同時(shí)間值的差同樣也是非常簡單。你所需要做的只是將兩個(gè)時(shí)間值轉(zhuǎn)換為Unix的時(shí)間戳值,然后兩者相減即可。兩者之差即為兩個(gè)時(shí)間所相隔的秒數(shù)。另外一些算法可以很快地將秒轉(zhuǎn)為天、小時(shí)、分和秒。 

**為PHP添加DateAdd函數(shù) 

正如在文章一開始我所說的-寫本文的原因是因?yàn)槲以赑HP中找不到類似ASP的DateDiff函數(shù)。在介紹完P(guān)HP是如何處理日期和時(shí)間,讓我們將ASP中常用的兩個(gè)函數(shù)移植到PHP。第一個(gè)函數(shù)是DateAdd。 
根據(jù)Vbscript的文檔,DateAdd(interval,number,date)函數(shù)的定義為“返回已添加指定時(shí)間間隔的日期。” 
Inetrval為表示要添加的時(shí)間間隔字符串表達(dá)式,例如分或天;number為表示要添加的時(shí)間間隔的個(gè)數(shù)的數(shù)值表達(dá)式;Date表示日期。 
Interval(時(shí)間間隔字符串表達(dá)式)可以是以下任意值: 
yyyy year年 
q Quarter季度 
m Month月 
y Day of year一年的數(shù) 
d Day天 
w Weekday一周的天數(shù) 
ww Week of year周 
h Hour小時(shí) 
n Minute分 
s Second秒 
w、y和d的作用是完全一樣的,即在目前的日期上加一天,q加3個(gè)月,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文件,然后運(yùn)行以下代碼: 

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函數(shù) 
現(xiàn)在DateAdd已經(jīng)完成,那么DateDiff呢? 
根據(jù)文檔,DateDiff(interval,date1,date2)函數(shù)的定義為“返回兩個(gè)日期之間的時(shí)間間隔”。 
Intervals參數(shù)的用法與DateAdd函數(shù)中的相同。出于避免過于復(fù)雜的考慮,我們決定忽略Vbscript中DateDiff函數(shù)中其它復(fù)雜的參數(shù),即其兩個(gè)可選的參數(shù)變量[firstdayofweek[, firstweekofyear]](它們用于決定星期中第一天是星期天還是星期一和一年中第一周的常數(shù)。而且我們只允許intervals有以下五個(gè)值:"w"(周)、"d"(天)、"h"(小時(shí))、"n"(分鐘) 和"s"(秒)。 

Let's see what we can come up with: 下面的代碼是我們所需要的: 

Function DateDiff ($interval, $date1,$date2) { 
// 得到兩日期之間間隔的秒數(shù) 
$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文件,然后運(yùn)行下面的代碼: 

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; 

如果一切順利,你可以看到以下結(jié)果: 
Current time: 16h23 Saturday 03 Jun 
Time plus 50 minutes: 17h13 Saturday 03 Jun 
Interval between two times: 50 
如果你在Unix機(jī)器上運(yùn)行PHP,你必須編譯PHP支持BC高精度函數(shù)。你必須從以下地址http://www.php.net/extra/number4.tar.gz下載BC庫,然后將其解壓到PHP4的根目錄下,重新編譯PHP,編譯時(shí)要加上--enable-bcmath的選項(xiàng)。(詳細(xì)說明見PHP4中README.BCMATH)。PHP4的Windows版本則不需要做任何修補(bǔ)即可直接使用BC高精度函數(shù)。 
現(xiàn)在你已經(jīng)得到處理日期和時(shí)間的函數(shù),剩下的就是如何將其運(yùn)用到你的PHP程序中

相關(guān)文章

最新評論