在PHP中處理日期

2021-08-28 05:36:32 字數 4089 閱讀 1214

有許多話題論壇又來了,話題很多人常常有困難。 其中乙個問題是如何處理日期,將其轉換成不同的格式,時區問題,等等。本教程將試**決的許多常見問題與日期和時間相關的問題。

包括如何在php中處理日期之前,我想談一下應該如何日期儲存在乙個資料庫中。 具體我要談談mysql。因為這就是我最的經驗。 也有其他dbms設施來處理日期和時間資訊,所以你可以檢視手冊。

許多人「發明」自己的方式在資料庫中儲存日期,這不可避免地給了他們一些麻煩。 例如他們可能有乙個varchar欄位型別和儲存日期以dd / mm / yyyy格式。 這是錯誤的方法。

有許多不同的方法可以將日期正確地儲存在乙個資料庫中。 一種方法是整數字段,儲存乙個unix時間戳。 我不喜歡這種方法。 它讓你無法使用mysql的日期和時間函式,並且有潛在的問題y2k38問題。

mysql資料型別稱為時間戳。 這將顯示的日期和時間iso 8601格式,即從最重要的部分(年)最重要的部分(第二)。 乙個例子可能是2009-08-18 9:17:21。 額外的格式輸入的時候,其實沒有必要,所以2009081891721將是一樣的。

還有乙個資料型別稱為datetime。 第一次看它時,它似乎相同的時間戳,但事實並非如此。 首先,時間戳y2k38仍有問題的事情,所以它只能儲存日期,可以用乙個32位無符號整數表示從unix紀元(1970-01-01就是)。 這給了乙個上限2038-01-19 03:14:07。 datetime沒有這個問題; 它可以儲存日期從1000-01-01到9999-12-31。 最後,有一些資料型別稱為日期和時間。 這些都是如果你只需要日期或時間只有一部分。

我的建議是使用datetime、日期或時間取決於您的需要。 事實上,有一年的型別。 使用mysql的內建資料型別儲存日期和時間允許您使用它日期和時間函式。

我不會使用資料庫在本教程的其餘部分。 示例假設您已經有一些字串包含一些日期。

這是乙個非常常見的問題。 當使用date()函式在php中使用伺服器時間總是生成日期和時間戳。 除非你是在乙個不同的時區比你的伺服器,這不是乙個問題。 我有乙個vps(虛擬專用伺服器)在英國,但我住在丹麥。 這是乙個小時的時差。 如何獲得php顯示正確的時間給我嗎?

因為我是伺服器管理員,我可以改變伺服器的時鐘(這是我所做的)。 大多數人不能這樣做,所以我們必須解決這個問題的一些替代方案。

讓我們試試:

回聲日期(h:我:年代」);
我的電腦的當地時間是09:34:08,這也是輸出。 現在我們將試圖改變時區:

作用是(「美國/ new_york」);

回聲日期(h:我:年代」);

我們會得到03:34:08。 所以它似乎工作(多麼幸運!)。 這是乙個非常好的方法。

如果我們需要多個日期不同的時區,但相同頁面? 這非常簡單。 考慮下面的例子:

作用是(「歐洲/哥本哈根」);

回聲在哥本哈根召開的時間是: 。日期(h:我:年代」) 。php_eol;

作用是(「美國/ new_york」);

回聲」在紐約的時間是: 。日期(h:我:年代」) 。php_eol;

作用是(「歐洲/莫斯科」);

回聲在莫斯科的時間是: 。日期(h:我:年代」) 。php_eol;

將目前的輸出是:

在哥本哈根召開的時間是:09:45:56

在紐約的時間是:03:45:56

在莫斯科的時間是:11:45:56

最後,php函式函式(),總是在格林尼治時間格式的日期。 如果你知道抵消在幾秒鐘內你可以做:

函式的(h:我:年代」,時間() +抵消美元);
,所以你可能會做的

函式的(h:我:年代」,時間() + 2023年);
乙個偏移量的乙個小時。 然而,這需要你dst要考慮進去。 並非所有國家遵守dst,一些不同於其他人。 我的建議是使用php的內建支援時區。

「我有乙個約會在dd / mm / yyyy但是;我需要它。 救命!」

我們如何幫助這個人嗎? 好吧,讓我們分析這個問題。 每個日期由三部分組成:一天,月,年。 所以,我們需要做的是重新排序,使用連字元而不是斜槓。 我們有幾個方式可以做到這一點。 讓我們先試著**。 我們有乙個函式呼叫**()的。

olddate美元= 「18/08/2009」; / / dd / mm / yyyy

美元的部分=**(' / ',olddate美元);

/ * *

*現在我們有:

*部分美元[0]:一天

*部分美元[1]:

*部分美元[2]:

*我們也可以做:

*列表(日,月,美元美元)=**(「/」,olddate美元);

* /newdate美元= 「 -  」; / /;

echo $ newdate; / / 08-18-2009

這似乎很好工作。 我們還可以使用正規表示式。 這基本上是乙個一行程式:

olddate美元= 「18/08/2009」;

newdate美元=preg_replace(「# ^(\ d )/(\ d )/(\ d )$ #」, ' $ 2 - $ 1 - $ 3 ',olddate美元);

我不打算解釋正規表示式在本教程中。 你可以看看這個正規表示式教程的。

任何其他方法嗎? 是的,有! 因為它通常是程式設計,有很多方法可以做到一件事。 假設我們已經分手日期在三個變數美元一天,美元的月和美元一年我們可以用乙個函式呼叫mktime()生成乙個unix時間戳,然後使用日期()格式它以這種方式:

美元的時間戳=mktime(0, 0, 0,美元的月,美元一天,美元一年);

回聲日期(「m-d-y」,美元的時間戳);

另一種方法是使用strtotime()乙個格式化的字串轉換成乙個unix時間戳。 除了strtotime()不承認dd / mm / yyyy作為乙個有效的日期格式,返回false。 也有模稜兩可的問題。 考慮到字串07-08-2009。 是8月7日還是7月8日? 它將是前者。

如果你把乙個日期作為輸入(例如生日),這將是非常有用的知道它實際上是乙個有效的日期。 有兩個條件必須滿足乙個日期之前可以認為是有效的:

它必須符合特定格式(例如我們可能只希望yyyy-mm-dd)。

日期必須實際上存在(2009-02-29不存在,但2008-02-29)。

第乙個條件是相當簡單的,我們可以使用正規表示式。 第二個是稍微複雜一些。 我們將不得不考慮乙個月的長度。 也許這是乙個閏年,也許它不是嗎? 幸運的是,我們不必擔心; php有乙個函式呼叫checkdate(),嗯…… 檢查日期。 所以,正規表示式和checkdate()是我們所需要的。 乙個小例子:

< ?php

如果 ($ _server(「request_method」] = = 「職位」 &&收取($ _post(「日期」))) )-(\ d )(\ d )$ #」,$ _post(「日期」),$匹配) &&checkdate($匹配(2),$匹配(3),$匹配(1))) 

其他的 

回聲「人力資源》 <」;

}? >

《表單動作= "< ?php echo $ _server(「php_self」] ? >」方法= " post " >

《標籤 為=「日期」>輸入乙個iso 8601日期:< /標籤》

< input type = " text " name = "日期" id =「日期」< ?php如果 (!空($ _post(「日期」])): ? >值= "< ?php echo htmlentities($ _post(「日期」]) ? >」< ?php endif? >>

《按鈕 型別=「提交」>檢查的有效性< /按鈕》

< /形式》

這個例子應該是相當簡單的。 首先我們檢查的格式字串使用preg_match(),我們也提取月,日和年反向引用。 preg_match()返回true,如果字串是否與模式匹配。 因為邏輯,從左到右的關聯,preg_match()是評價第一,checkdate()僅僅是評估如果第乙個運算元是正確的(如果左運算元是假的,和表達不可能返回true,所以評估正確的運算元是多餘的,因此它不是的原因)。

您可能設定附加條件必須滿足在考慮乙個日期之前有效。 你可能會問約會間隔意味著第乙個必須比過去早。 你可能只希望日期在過去或未來,或者他們可能要在乙個特定的預設時間間隔。 最簡單的方法是將日期轉換為unix時間戳。 從在此基本的整數的比較。 我把它作為練習。 乙個更安全的賭注(記得y2k38)可能使用datetime::diff()

PHP 日期處理

a am 或是 pm a am 或是 pm d 幾日,二位數字,若不足二位則前面補零 如 01 至 31 d 星期幾,三個英文本母 如 fri f 月份,英文全名 如 january h 12 小時制的小時 如 01 至 12 h 24 小時制的小時 如 00 至 23 g 12 小時制的小時,不足...

php 日期處理

date y m d h i s strtotime 1 days 顯示下一天日期,日期增加一天 date y m d strtotime 1 days date y m d 中間的day在使用的時候可按情況變成月等 1 int strtotime string time int now 將任何英文...

PHP日期處理

前n天 echo date y m d strtotime n day 後n天 echo date y m d strtotime n day 本周一 echo date y m d time date w 0 7 date w 1 24 3600 本週日 echo date y m d time ...