時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
我正打算用PHP編寫一種幫助處理系統(tǒng)。我發(fā)現(xiàn)我必須知道處理完最后一位客戶的問題后已經(jīng)過去了多長時(shí)間?當(dāng)我過去用ASP時(shí)解決這個(gè)問題相當(dāng)簡單,ASP有相應(yīng)的函數(shù)DateDiff可以給出兩個(gè)日期間間隔多少月、多少天和多少秒。當(dāng)我搜尋完PHP手冊后我發(fā)現(xiàn)PHP并沒有類似的函數(shù)。
本文包含以下內(nèi)容:
1、 得到目前的日期和時(shí)間-我們有多少種方式?
2、 改變?nèi)掌陲@示的方式-日期和時(shí)間的顯示形式
3、 轉(zhuǎn)換現(xiàn)在的日期為Unix的時(shí)間戳值
4、 改變?nèi)掌?br>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)這對(duì)我毫無幫助,或者只有一點(diǎn)幫助。在PHP中,對(duì)日期處理的函數(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"。
我們需要對(duì)字符串中的每一部分使用一個(gè)特殊格式化字符,你可以從PHP手冊中日期和時(shí)間函數(shù)庫中找到。這樣的特殊格式化字符數(shù)量不少,他們所表示的類似于星期幾、月的英文名、用2位或4位數(shù)表示的年份,是否是上午(AM)或下午(PM)以及其他。對(duì)于這個(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í)間,我們是否需要對(duì)每個(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è)百分號(hào)%。如果用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的格式存儲(chǔ),加入目前的日前即為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í)間戳值放入相對(duì)應(yīng)的名稱變量中,所以代碼變得相對(duì)容易閱讀和理解。現(xiàn)在如果我們需要在目前的
關(guān)鍵詞標(biāo)簽:時(shí)間,日期,我們,函數(shù),
相關(guān)閱讀 mysql 時(shí)間轉(zhuǎn)換函數(shù)的用法 PHP設(shè)置COOKIE保留時(shí)間為瀏覽器進(jìn)程 防止病毒修改系統(tǒng)時(shí)間的另外一種方法 搜狗五筆輸入法的漢字變成繁體字的簡單教程 口袋妖怪單機(jī)版合成表全部-最新口袋妖怪單機(jī)合體大全 PHP會(huì)話——session 時(shí)間設(shè)定使用入門
熱門文章 plsql developer怎么連接數(shù)據(jù)庫-plsql developer連接數(shù)據(jù)庫方法 2021年最好用的10款php開發(fā)工具推薦 php利用淘寶IP庫獲取用戶ip地理位置 在 PHP 中使用命令行工具
時(shí)間:2023-04-08 19:15:00
時(shí)間:2022-06-06 15:38:07
時(shí)間:2022-02-18 18:28:29
時(shí)間:2021-06-04 17:17:59
時(shí)間:2021-05-10 18:05:50
時(shí)間:2021-05-10 18:05:40
人氣排行 詳解ucenter原理及第三方應(yīng)用程序整合思路、方法 plsql developer怎么連接數(shù)據(jù)庫-plsql developer連接數(shù)據(jù)庫方法 PHP中防止SQL注入攻擊 PHP會(huì)話Session的具體使用方法解析 PHP運(yùn)行出現(xiàn)Notice : Use of undefined constant 的解決辦法 PHP如何清空mySQL數(shù)據(jù)庫 CakePHP程序員必須知道的21條技巧 PHP采集圖片實(shí)例(PHP采集)