首頁 後端開發 php教程 PHP中的日期處理有哪些方法

PHP中的日期處理有哪些方法

Jul 03, 2017 am 09:16 AM
php 處理 時間

本文包含以下內容:  
#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#我們#這正是我們所要的。但如果我們在一個十分複雜的句子中需要包含日期和時間,我們是否需要對每個字元使用轉義字元?  

答案當然是不。我們使用另一個函數strftime()。  ###strftime()有兩個好處。第一個好處我們並不在本文討論範圍內-如果你使用setlocale()函數,你可以透過strftime得到對應語言的月份的名稱。另外的一個好處是你可以將特別的日期和時間的格式化字元包含在你的字串中。這同時也意味著無論你是否要學習date()函數的所有特殊格式化字符,你都必須學習一整套完全不同的格式化字符。  ###strftime()運作的方式和date()沒有什麼不同,除了特殊格式化字元的前面必須加上一個百分號%。如果用strftime()函數,前面例子的程式碼如下:  #######
?  
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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

See all articles