国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 後端開發(fā) php教程 在PHP和MySQL中與日期和時(shí)間合作

在PHP和MySQL中與日期和時(shí)間合作

Feb 28, 2025 am 09:22 AM

Working with Dates and Times in PHP and MySQL

在任何編程語言中處理日期和時(shí)間通常是一項(xiàng)簡單瑣碎的任務(wù),直到需要支持時(shí)區(qū)。幸運(yùn)的是,PHP擁有一套強(qiáng)大的日期/時(shí)間工具,可以幫助您處理各種時(shí)間相關(guān)問題:Unix時(shí)間戳、格式化日期以供人類閱讀、顯示帶有時(shí)區(qū)的日期、計(jì)算現(xiàn)在到下個(gè)月第二個(gè)星期二之間的時(shí)間差等等。本文將介紹PHP的時(shí)間函數(shù)(time()、mktime()date())及其面向?qū)ο駥?yīng)項(xiàng)的基礎(chǔ)知識,然後了解MySQL日期,並向您展示如何使它們與PHP完美配合。

主要收穫

  • 利用PHP強(qiáng)大的日期和時(shí)間函數(shù),如time()mktime()date(),有效處理Unix時(shí)間戳和格式化日期。
  • 利用PHP的DateTimeDateTimeZone對象進(jìn)行面向?qū)ο蟮娜掌诤蜁r(shí)間操作,包括處理不同的時(shí)區(qū)。
  • 將日期存儲在MySQL中作為Unix時(shí)間戳,以保持不同時(shí)區(qū)之間的一致性,並利用PHP的日期/時(shí)間函數(shù)進(jìn)行轉(zhuǎn)換和格式化。
  • 將服務(wù)器的默認(rèn)時(shí)區(qū)設(shè)置為PHP配置中的UTC,以簡化日期和時(shí)間管理並確保應(yīng)用程序的一致性。

PHP日期和時(shí)間函數(shù)

本文的大部分內(nèi)容將使用Unix時(shí)間,也稱為POSIX時(shí)間或紀(jì)元時(shí)間。時(shí)間表示為自1970年1月1日午夜UTC以來經(jīng)過的秒數(shù)。如果您對Unix時(shí)間的完整歷史感興趣,請查看維基百科上的Unix時(shí)間文章。 UTC(協(xié)調(diào)世界時(shí)),也稱為GMT,有時(shí)也稱為Zulu時(shí)間,是0度經(jīng)線的時(shí)間。世界上所有其他時(shí)區(qū)都表示為相對於此時(shí)間的正或負(fù)偏移量。使用UTC和Unix時(shí)間處理時(shí)間,在需要處理時(shí)區(qū)時(shí)會讓您的生活更輕鬆。稍後我會詳細(xì)介紹這一點(diǎn),但現(xiàn)在讓我們忽略時(shí)區(qū)問題,並查看一些時(shí)間函數(shù)。

獲取當(dāng)前Unix時(shí)間

time()不接受任何參數(shù),並返回自Unix紀(jì)元以來的秒數(shù)。為了說明這一點(diǎn),我將使用PHP交互式CLI shell。

sean@beerhaus:~$ php -a
php > print time();
1324402770

如果您需要Unix時(shí)間的數(shù)組表示,請使用getdate()函數(shù)。它接受一個(gè)可選的Unix時(shí)間戳參數(shù),但如果沒有提供,則默認(rèn)為time()的值。

php > $unixTime = time();
php > print_r(getdate($unixTime));
Array
(
    [seconds] => 48
    [minutes] => 54
    [hours] => 12
    [mday] => 20
    [wday] => 2
    [mon] => 12
    [year] => 2011
    [yday] => 353
    [weekday] => Tuesday
    [month] => December
    [0] => 1324403688
)

格式化Unix時(shí)間

Unix時(shí)間可以輕鬆格式化為人類希望閱讀的任何字符串。 date()用於將Unix時(shí)間戳格式化為人類可讀的字符串,並接受一個(gè)格式化參數(shù)和一個(gè)可選的時(shí)間參數(shù)。如果沒有提供可選的時(shí)間戳,則使用time()的值。

sean@beerhaus:~$ php -a
php > print time();
1324402770

“r”格式化字符串返回由RFC 2822指定的格式化時(shí)間。當(dāng)然,您可以使用其他說明符來定義您自己的自定義格式。

php > $unixTime = time();
php > print_r(getdate($unixTime));
Array
(
    [seconds] => 48
    [minutes] => 54
    [hours] => 12
    [mday] => 20
    [wday] => 2
    [mon] => 12
    [year] => 2011
    [yday] => 353
    [weekday] => Tuesday
    [month] => December
    [0] => 1324403688
)

有關(guān)可接受的格式化字符的完整列表,請參閱PHP文檔中date()的頁面。但是,當(dāng)與mktime()strtotime()函數(shù)結(jié)合使用時(shí),該函數(shù)變得更有用,正如您將在接下來的示例中看到的。

根據(jù)給定時(shí)間創(chuàng)建Unix時(shí)間

mktime()用於根據(jù)與日期的每個(gè)部分相對應(yīng)的值列表(秒、分、小時(shí)、年等)創(chuàng)建Unix時(shí)間戳。它接受許多整數(shù)參數(shù),以以下順序設(shè)置日期的每個(gè)部分:

php > print date("r", $unixTime);
Tue, 20 Dec 2011 12:54:48 -0500

如果啟用了夏令時(shí),則將isDST設(shè)置為1;如果沒有啟用,則設(shè)置為0;如果未知,則設(shè)置為-1(默認(rèn)值)。

php > print date("m/d/y h:i:s a", $unixTime);
12/20/11 12:54:48 pm
php > print date("m/d/y h:i:s a");
12/20/11 01:12:11 pm
php > print date("jS of F Y", $unixTime);
20th of December 2011

您可以看到,在處理使用用戶自定義日期範(fàn)圍的數(shù)據(jù)庫查詢時(shí),mktime()非常有用。例如,如果您在MySQL中將時(shí)間戳存儲為整數(shù)(Unix時(shí)間)(預(yù)示著任何人嗎?),則很容易設(shè)置一個(gè)常見的年至今查詢範(fàn)圍。

<code>mktime(hour, minute, second, month, day, year, isDST)</code>

將英文日期解析為Unix時(shí)間

幾乎神奇的函數(shù)strtotime()將日期/時(shí)間格式的字符串作為其第一個(gè)參數(shù),以及用作轉(zhuǎn)換基礎(chǔ)的Unix時(shí)間戳。請參閱文檔以了解可接受的日期格式。

php > print date("r", mktime(12, 0, 0, 1, 20, 1987));
Tue, 20 Jan 1987 12:00:00 -0500
php > print date("r", mktime(0, 0, 0, date("n"), date("j"), date("Y")));
Tue, 20 Dec 2011 00:00:00 -0500
php > print date("r", mktime(23, 59, 59, date("n"), date("j"), date("Y")));
Tue, 20 Dec 2011 23:59:59 -0500

PHP的DateTime和DateTimeZone對象

PHP的DateTime對像是處理日期和時(shí)區(qū)的面向?qū)ο蠓椒?。?gòu)造方法接受時(shí)間的字符串表示,非常類似於上面的strtotime(),有些人可能會覺得這更容易使用。如果沒有提供參數(shù),則默認(rèn)值為“now”。

<?php $startTime = mktime(0, 0, 0, 1, 1, date("y"));
$endTime  ?= mktime(0, 0, 0, date("m"), date("d"), date("y"));

DateTimeformat()方法與上面的date()函數(shù)的工作方式相同,並接受所有相同的格式化字符。 DateTime對像還帶有一些有用的常量,可以將其饋送到format()方法。

php > print strtotime("now");
1324407707
php > print date("r", strtotime("now"));
Tue, 20 Dec 2011 14:01:51 -0500
php > print strtotime("+1 week");
1325012569
php > print date("r", strtotime("+1 week"));
Tue, 27 Dec 2011 14:03:03 -0500
php > print date("r", strtotime("next month"));
Fri, 20 Jan 2012 14:04:20 -0500
php > print date("r", strtotime("next month", mktime(0, 0, 0)));
Fri, 20 Jan 2012 00:00:00 -0500
php > print date("r", strtotime("next month", mktime(0, 0, 0, 1, 31)));
Thu, 03 Mar 2011 00:00:00 -0500

可以在DateTime文檔頁面上找到完整的常量列表。由於我們很快就會處理時(shí)區(qū),讓我們?yōu)镻HP提供一個(gè)默認(rèn)時(shí)區(qū)。在您的php.ini配置文件(我有一個(gè)用於CLI,一個(gè)用於Apache)中,找到如下所示的部分:

php > $dt = new DateTime("now"); 
php > print $dt->format("r");
Tue, 20 Dec 2011 16:28:32 -0500
php > $dt = new DateTime("December 31 1999 12:12:12 EST");
php > print $dt->format("r");
Fri, 31 Dec 1999 12:12:12 -0500

當(dāng)沒有為date.timezone賦予值時(shí),PHP將盡力確定在服務(wù)器上設(shè)置的系統(tǒng)時(shí)區(qū)。您可以使用date_default_timezone_get()檢查PHP正在使用哪個(gè)值。

sean@beerhaus:~$ php -a
php > print time();
1324402770

讓我們將服務(wù)器的時(shí)區(qū)設(shè)置為UTC時(shí)間(date.timezone = UTC)並保存配置文件。您必須重新啟動Apache或CLI shell才能查看更改。 PHP DateTime對象包括一個(gè)內(nèi)部DateTimeZone類實(shí)例來跟蹤時(shí)區(qū)。當(dāng)您創(chuàng)建DateTime的新實(shí)例時(shí),內(nèi)部DateTimeZone應(yīng)設(shè)置為在php.ini中提供的默認(rèn)值。

php > $unixTime = time();
php > print_r(getdate($unixTime));
Array
(
    [seconds] => 48
    [minutes] => 54
    [hours] => 12
    [mday] => 20
    [wday] => 2
    [mon] => 12
    [year] => 2011
    [yday] => 353
    [weekday] => Tuesday
    [month] => December
    [0] => 1324403688
)

可以在時(shí)區(qū)文檔頁面上找到可接受的時(shí)區(qū)名稱的完整列表。您現(xiàn)在可以看到當(dāng)兩個(gè)DateTime對像被賦予不同的時(shí)區(qū)時(shí),時(shí)間差異。例如,這是一個(gè)將UTC轉(zhuǎn)換為America/New_York(EST)時(shí)間的示例。

php > print date("r", $unixTime);
Tue, 20 Dec 2011 12:54:48 -0500

請注意12月份的-0500偏移量。如果您將時(shí)間值更改為夏季日期,例如7月1日,您會發(fā)現(xiàn)它知道夏令時(shí)(EDT)。

php > print date("m/d/y h:i:s a", $unixTime);
12/20/11 12:54:48 pm
php > print date("m/d/y h:i:s a");
12/20/11 01:12:11 pm
php > print date("jS of F Y", $unixTime);
20th of December 2011

將日期與MySQL和PHP一起使用

如果您在任何級別使用過MySQL,您可能已經(jīng)註意到開箱即用的DATETIME類型。它看起來和聞起來像一個(gè)日期,如果您說它是一個(gè)日期,那麼您是對的。但是,一旦您將其從MySQL中SELECT到PHP中,您實(shí)際上擁有的只是一個(gè)看起來像日期的字符串。它沒有時(shí)區(qū)意識,並且在人類需要查看它之前就已經(jīng)格式化好供人類使用了。 是的,我知道MySQL有很多日期格式化函數(shù),但我們也已經(jīng)在使用PHP了,正如您所看到的,PHP在處理日期格式方面非常出色。為什麼我們還要從數(shù)據(jù)庫中直接格式化它呢?我們可能需要應(yīng)用一些不同的轉(zhuǎn)換和格式。最好只在人類即將看到日期時(shí)才格式化日期。

<code>mktime(hour, minute, second, month, day, year, isDST)</code>

運(yùn)行這個(gè)簡單的腳本,您可以看到您從DATETIME字段獲得的只是一個(gè)格式化的字符串,沒有時(shí)區(qū)信息。

php > print date("r", mktime(12, 0, 0, 1, 20, 1987));
Tue, 20 Jan 1987 12:00:00 -0500
php > print date("r", mktime(0, 0, 0, date("n"), date("j"), date("Y")));
Tue, 20 Dec 2011 00:00:00 -0500
php > print date("r", mktime(23, 59, 59, date("n"), date("j"), date("Y")));
Tue, 20 Dec 2011 23:59:59 -0500

DATETIME值是運(yùn)行MySQL的服務(wù)器的本地時(shí)間,無論該服務(wù)器的時(shí)區(qū)是什麼。如果您所做的所有事情都只涉及一個(gè)時(shí)區(qū)中的一個(gè)服務(wù)器,那麼DATETIME可能適合您的大部分需求,而且我非常羨慕您。那麼,如何使用PHP和MySQL處理日期和時(shí)區(qū)呢?將日期存儲為Unix時(shí)間戳。您已經(jīng)知道Unix時(shí)間是自1970年1月1日UTC以來的秒數(shù),因此這為您提供了一個(gè)恆定的時(shí)區(qū),並且您可能已經(jīng)註意到PHP的許多日期/時(shí)間函數(shù)都是基於Unix時(shí)間戳的。在使用MySQL時(shí),我通常創(chuàng)建將日期存儲為INTEGER UNSIGNED的表列。插入日期時(shí),您可以使用PHP的time()或MySQL的UNIX_TIMESTAMP()。

<?php $startTime = mktime(0, 0, 0, 1, 1, date("y"));
$endTime  ?= mktime(0, 0, 0, date("m"), date("d"), date("y"));

如果您希望MySQL格式化日期,您可以這樣做。但是時(shí)間將位於運(yùn)行MySQL的服務(wù)器的時(shí)區(qū)中,我建議您在到達(dá)Web應(yīng)用程序的模板/視圖級別並準(zhǔn)備好讓人眼看到它之前,不要進(jìn)行任何類型的格式化。

sean@beerhaus:~$ php -a
php > print time();
1324402770

在任何跨越時(shí)區(qū)的應(yīng)用程序中,您通常都會有一個(gè)表來跟蹤用戶的自定義時(shí)區(qū)設(shè)置,然後將其讀入$_SESSION值。假設(shè)您有一個(gè)如下所示的會話條目:

php > $unixTime = time();
php > print_r(getdate($unixTime));
Array
(
    [seconds] => 48
    [minutes] => 54
    [hours] => 12
    [mday] => 20
    [wday] => 2
    [mon] => 12
    [year] => 2011
    [yday] => 353
    [weekday] => Tuesday
    [month] => December
    [0] => 1324403688
)

您可以輕鬆地將存儲的Unix時(shí)間(以UTC為單位)轉(zhuǎn)換為特定用戶的時(shí)區(qū)中的任何日期。

php > print date("r", $unixTime);
Tue, 20 Dec 2011 12:54:48 -0500

這將導(dǎo)致日期“Mon, 16 Jan 2012 12:03:49 -0600”。 -0600告訴您它比UTC落後6小時(shí),UTC的偏移量為0。如果我們將時(shí)區(qū)設(shè)置為America/Los_Angeles,則生成的日期將是:

php > print date("m/d/y h:i:s a", $unixTime);
12/20/11 12:54:48 pm
php > print date("m/d/y h:i:s a");
12/20/11 01:12:11 pm
php > print date("jS of F Y", $unixTime);
20th of December 2011

而America/New_York將產(chǎn)生:

<code>mktime(hour, minute, second, month, day, year, isDST)</code>

總結(jié)

處理日期和時(shí)區(qū)是許多程序員日常生活中的一部分,但是當(dāng)您可以使用PHP強(qiáng)大且易於使用的日期庫時(shí),無需擔(dān)心。您已經(jīng)了解瞭如何獲取Unix時(shí)間戳、如何將日期格式化為任何可以想像的格式、如何將日期的英文表示解析為時(shí)間戳、如何將一段時(shí)間添加到時(shí)間戳以及如何在時(shí)區(qū)之間進(jìn)行轉(zhuǎn)換。如果本文有兩個(gè)主要要點(diǎn),那就是1)堅(jiān)持使用Unix時(shí)間,以及2)在使用PHP和MySQL時(shí),堅(jiān)持使用UTC作為所有日期的基礎(chǔ)時(shí)區(qū)?;禪TC的所有時(shí)間的想法不僅適用於PHP和MySQL;它在任何語言中都被認(rèn)為是最佳實(shí)踐。如果您發(fā)現(xiàn)自己正在使用其他語言工作,那麼您很有可能會對自己說:“該死的,他們?yōu)槭颤N不能像PHP那樣做?”

圖片來自Yakobchuk Vasyl / Shutterstock

(此處應(yīng)添加關(guān)於在PHP中處理日期和時(shí)間的常見問題的FAQ部分,類似於輸入文本中的FAQ部分。 由於篇幅限制,我沒有在此處添加。)

以上是在PHP和MySQL中與日期和時(shí)間合作的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? 如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在於驗(yàn)證文件類型、重命名文件並限制權(quán)限。 1.使用finfo_file()檢查真實(shí)MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機(jī)文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限製文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在於類型檢查的嚴(yán)格程度。 ==在比較前會進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時(shí)使用。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學(xué)運(yùn)算的方法如下:1.加法用 號,支持整數(shù)和浮點(diǎn)數(shù),也可用於變量,字符串?dāng)?shù)字會自動轉(zhuǎn)換但不推薦依賴;2.減法用-號,變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號,適用於數(shù)字及類似字符串;4.除法用/號,需避免除以零,並註意結(jié)果可能是浮點(diǎn)數(shù);5.取模用%號,可用於判斷奇偶數(shù),處理負(fù)數(shù)時(shí)餘數(shù)符號與被除數(shù)一致。正確使用這些運(yùn)算符的關(guān)鍵在於確保數(shù)據(jù)類型清晰並處理好邊界情況。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴(kuò)展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(通過PECL或Composer安裝)創(chuàng)建客戶端實(shí)例並操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用於高性能場景,Predis則便於快速部署;兩者均適用於生產(chǎn)環(huán)境且文檔完善。

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles