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

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

在PHP和MySQL中與日期和時間合作

Feb 28, 2025 am 09:22 AM

Working with Dates and Times in PHP and MySQL

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

主要收獲

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

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

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

獲取當前Unix時間

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

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

如果您需要Unix時間的數(shù)組表示,請使用getdate()函數(shù)。它接受一個可選的Unix時間戳參數(shù),但如果沒有提供,則默認為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時間

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

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

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

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()的頁面。但是,當與mktime()strtotime()函數(shù)結(jié)合使用時,該函數(shù)變得更有用,正如您將在接下來的示例中看到的。

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

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

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

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

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

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

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

將英文日期解析為Unix時間

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

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對象是處理日期和時區(qū)的面向?qū)ο蠓椒?。?gòu)造方法接受時間的字符串表示,非常類似于上面的strtotime(),有些人可能會覺得這更容易使用。如果沒有提供參數(shù),則默認值為“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文檔頁面上找到完整的常量列表。由于我們很快就會處理時區(qū),讓我們?yōu)镻HP提供一個默認時區(qū)。在您的php.ini配置文件(我有一個用于CLI,一個用于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

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

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

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

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
)

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

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

請注意12月份的-0500偏移量。如果您將時間值更改為夏季日期,例如7月1日,您會發(fā)現(xiàn)它知道夏令時(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類型。它看起來和聞起來像一個日期,如果您說它是一個日期,那么您是對的。但是,一旦您將其從MySQL中SELECT到PHP中,您實際上擁有的只是一個看起來像日期的字符串。它沒有時區(qū)意識,并且在人類需要查看它之前就已經(jīng)格式化好供人類使用了。是的,我知道MySQL有很多日期格式化函數(shù),但我們也已經(jīng)在使用PHP了,正如您所看到的,PHP在處理日期格式方面非常出色。為什么我們還要從數(shù)據(jù)庫中直接格式化它呢?我們可能需要應用一些不同的轉(zhuǎn)換和格式。最好只在人類即將看到日期時才格式化日期。

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

運行這個簡單的腳本,您可以看到您從DATETIME字段獲得的只是一個格式化的字符串,沒有時區(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值是運行MySQL的服務器的本地時間,無論該服務器的時區(qū)是什么。如果您所做的所有事情都只涉及一個時區(qū)中的一個服務器,那么DATETIME可能適合您的大部分需求,而且我非常羨慕您。那么,如何使用PHP和MySQL處理日期和時區(qū)呢?將日期存儲為Unix時間戳。您已經(jīng)知道Unix時間是自1970年1月1日UTC以來的秒數(shù),因此這為您提供了一個恒定的時區(qū),并且您可能已經(jīng)注意到PHP的許多日期/時間函數(shù)都是基于Unix時間戳的。在使用MySQL時,我通常創(chuàng)建將日期存儲為INTEGER UNSIGNED的表列。插入日期時,您可以使用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格式化日期,您可以這樣做。但是時間將位于運行MySQL的服務器的時區(qū)中,我建議您在到達Web應用程序的模板/視圖級別并準備好讓人眼看到它之前,不要進行任何類型的格式化。

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

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

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時間(以UTC為單位)轉(zhuǎn)換為特定用戶的時區(qū)中的任何日期。

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

這將導致日期“Mon, 16 Jan 2012 12:03:49 -0600”。-0600告訴您它比UTC落后6小時,UTC的偏移量為0。如果我們將時區(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é)

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

圖片來自Yakobchuk Vasyl / Shutterstock

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

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

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

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集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

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

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

編寫清潔和可維護的PHP代碼的最佳實踐是什么? 編寫清潔和可維護的PHP代碼的最佳實踐是什么? Jun 24, 2025 am 12:53 AM

寫干凈、易維護的PHP代碼關(guān)鍵在于清晰命名、遵循標準、合理結(jié)構(gòu)、善用注釋和可測試性。1.使用明確的變量、函數(shù)和類名,如$userData和calculateTotalPrice();2.遵循PSR-12標準統(tǒng)一代碼風格;3.按職責拆分代碼結(jié)構(gòu),使用MVC或Laravel式目錄組織;4.避免面條式代碼,將邏輯拆分為單一職責的小函數(shù);5.在關(guān)鍵處添加注釋并撰寫接口文檔,明確參數(shù)、返回值和異常;6.提高可測試性,采用依賴注入、減少全局狀態(tài)和靜態(tài)方法。這些做法提升代碼質(zhì)量、協(xié)作效率和后期維護便利性。

如何使用PHP執(zhí)行SQL查詢? 如何使用PHP執(zhí)行SQL查詢? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

如何快速測試PHP代碼片段? 如何快速測試PHP代碼片段? Jun 25, 2025 am 12:58 AM

toquicklytestaphpcodesnippet,useanonlinephpsandboxlike3v4l.orgorphpize.onlineforinstantantantExecutionWithOutSetup; runco??delocalocallocallocallocallocallocallywithpplibycreatinga.phpfileandexecutingitviateringitviatheterminal;

如何在PHP中使用頁面緩存? 如何在PHP中使用頁面緩存? Jun 24, 2025 am 12:50 AM

PHP頁面緩存可通過減少服務器負載和加快頁面加載速度提升網(wǎng)站性能。1.基本文件緩存通過生成靜態(tài)HTML文件并在有效期內(nèi)提供服務,避免重復生成動態(tài)內(nèi)容;2.啟用OPcache可將PHP腳本編譯為字節(jié)碼存儲在內(nèi)存中,提升執(zhí)行效率;3.對帶參數(shù)的動態(tài)頁面,應根據(jù)URL參數(shù)分別緩存,并避免緩存用戶特定內(nèi)容;4.可使用輕量級緩存庫如PHPFastCache簡化開發(fā)并支持多種存儲驅(qū)動。結(jié)合這些方法能有效優(yōu)化PHP項目的緩存策略。

如何升級PHP版本? 如何升級PHP版本? Jun 27, 2025 am 02:14 AM

升級PHP版本其實不難,但關(guān)鍵在于操作步驟和注意事項。以下是具體方法:1.確認當前PHP版本及運行環(huán)境,使用命令行或phpinfo.php文件查看;2.選擇適合的新版本并安裝,推薦8.2或8.1,Linux用戶用包管理器安裝,macOS用戶用Homebrew;3.遷移配置文件和擴展,更新php.ini并安裝必要擴展;4.測試網(wǎng)站是否正常運行,檢查錯誤日志確保無兼容性問題。按照這些步驟操作,大多數(shù)情況都能順利完成升級。

PHP初學者指南:當?shù)丨h(huán)境配置的詳細說明 PHP初學者指南:當?shù)丨h(huán)境配置的詳細說明 Jun 27, 2025 am 02:09 AM

要設(shè)置PHP開發(fā)環(huán)境,需選擇合適的工具并正確安裝配置。①最基礎(chǔ)的PHP本地環(huán)境需要三個組件:Web服務器(Apache或Nginx)、PHP本身和數(shù)據(jù)庫(如MySQL/MariaDB);②推薦初學者使用集成包如XAMPP或MAMP,它們簡化了安裝流程,XAMPP適用于Windows和macOS,安裝后將項目文件放入htdocs目錄并通過localhost訪問;③MAMP適合Mac用戶,支持便捷切換PHP版本,但免費版功能有限;④高級用戶可用Homebrew手動安裝,在macOS/Linux系統(tǒng)中

在Linux上配置PHP開發(fā)環(huán)境的步驟 在Linux上配置PHP開發(fā)環(huán)境的步驟 Jun 30, 2025 am 01:57 AM

TosetupaPHPdevelopmentenvironmentonLinux,installPHPandrequiredextensions,setupawebserverlikeApacheorNginx,testwithaPHPfile,andoptionallyinstallMySQLandComposer.1.InstallPHPandextensionsviapackagemanager(e.g.,sudoaptinstallphpphp-mysqlphp-curlphp-mbst

See all articles