ホームページ > バックエンド開発 > PHPチュートリアル > PHPおよびMySQLで日付と時間を操作します

PHPおよびMySQLで日付と時間を操作します

Jennifer Aniston
リリース: 2025-02-28 09:22:30
オリジナル
760 人が閲覧しました

Working with Dates and Times in PHP and MySQL

プログラミング言語での日付と時間の処理は、タイムゾーンをサポートする必要があるまで、多くの場合、単純で些細なタスクです。幸いなことに、PHPには、さまざまな時間関連の問題に対処するのに役立つ強力な日付/時刻ツールのセットがあります。UNIXタイムスタンプ、人間の読書のフォーマット日付、タイムゾーンの表示日、現在と来月の第2火曜日の時間差を計算するなど。この記事では、PHPの時間関数(

time()、およびmktime())とそれらのオブジェクト指向のカウンターパートの基本を紹介し、MySQLの日付について学び、PHPで完全に動作させる方法を示します。 date()

メインゲイン

  • time()mktime()などのPHPの強力な日付および時刻関数を使用して、UNIXタイムスタンプとフォーマットされた日付を効率的に処理します。 date()
  • 異なるタイムゾーンの処理を含む、オブジェクト指向の日付および時刻操作にPHPの
  • およびDateTimeオブジェクトを使用します。 DateTimeZone MySQLの日付をUNIXタイムスタンプとして保存して、異なるタイムゾーン間の一貫性を維持し、PHPの日付/時刻関数を使用して変換とフォーマットを維持します。
  • サーバーのデフォルトタイムゾーンをPHP構成でUTCに設定して、日付と時刻の管理を簡素化し、アプリケーションの一貫性を確保します。
PHP日付と時刻関数 現在のUNIX時間を取得

は、パラメーターを受け入れず、UNIXエポック以来秒数を返します。これを説明するために、PHP Interactive CLIシェルを使用します。

unix時間の配列表現が必要な場合は、

関数を使用します。オプションのUNIXタイムスタンプパラメーターを受け入れますが、デフォルトではtime()の値になります。

sean@beerhaus:~$ php -a
php > print time();
1324402770
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

getdate()Format unix time < time() unix時間は、人間が読みたい任意の文字列に簡単にフォーマットできます。

は、UNIXタイムスタンプを人間の読み取り可能な文字列にフォーマットし、フォーマットパラメーターとオプションの時間パラメーターを受け入れるために使用されます。オプションのタイムスタンプが提供されていない場合、
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
)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
の値が使用されます。

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
)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

許容されるフォーマットされた文字の完全なリストについては、PHPドキュメントのdate()のページを参照してください。ただし、次の例で表示されるように、mktime()およびstrtotime()関数と組み合わせて使用​​すると、関数がより便利になります。

指定された時間に基づいてUNIX時間を作成します

mktime()は、日付の各部分に対応する値(秒、分、時間、年など)のリストに基づいてUNIXタイムスタンプを作成するために使用されます。日付の各部分を次の順序で設定する多くの整数パラメーターを受け入れます。

php > print date("r", $unixTime);
Tue, 20 Dec 2011 12:54:48 -0500
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
夏時間が有効になっていない場合は、

を1に設定します。 isDST

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に整数(UNIX TIME)として保存する場合(誰もが予言しますか?)、一般的な年間のクエリ範囲を簡単に設定できます。 mktime()

<code>mktime(hour, minute, second, month, day, year, isDST)</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

英語の日付を解決する時間を解決

ほぼ魔法の関数

最初の引数として日付/時刻形式で文字列を使用し、変換の基礎として使用されるUNIXタイムスタンプを使用します。許容される日付形式については、ドキュメントを参照してください。 strtotime()

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 and datetimezoneオブジェクト

PHPの

オブジェクトは、日付とタイムゾーンを処理するオブジェクト指向の方法です。コンストラクターは、上記の文字列表現を上記のDateTimeと非常によく似ており、一部の人々は使いやすいと感じるかもしれません。パラメーターが提供されていない場合、デフォルト値は「Now」です。 strtotime()

<?php $startTime = mktime(0, 0, 0, 1, 1, date("y"));
$endTime   = mktime(0, 0, 0, date("m"), date("d"), date("y"));
ログイン後にコピー
ログイン後にコピー

DateTimeメソッドは、上記のformat()関数と同じように機能し、同じフォーマットされたすべての文字を受け入れます。 date()オブジェクトには、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
ログイン後にコピー
定数の完全なリストは、

ドキュメントページにあります。すぐにタイムゾーンを扱うので、PHPのデフォルトタイムゾーンを提供しましょう。 php.ini構成ファイル(CLI用に1つ、Apache用のファイルがあります)で、以下に示すセクションを見つけます:> DateTime

値が
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
ログイン後にコピー
に割り当てられていない場合、PHPはサーバーに設定されたシステムタイムゾーンを決定するために最善を尽くします。

を使用して、PHPが使用している値を確認できます。 date.timezone

sean@beerhaus:~$ php -a
php > print time();
1324402770
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

サーバーのタイムゾーンをUTC時間(date.timezone = UTC)に設定し、構成ファイルを保存しましょう。変更を表示するには、ApacheまたはCLIシェルを再起動する必要があります。 PHPDateTimeオブジェクトには、タイムゾーンを追跡するための内部DateTimeZoneクラスインスタンスが含まれています。 DateTimeの新しいインスタンスを作成する場合、内部DateTimeZoneは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
)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

許容可能なタイムゾーン名の完全なリストは、タイムゾーンドキュメントページにあります。 2つのDateTimeオブジェクトに異なるタイムゾーンが与えられると、時差が表示されるようになりました。たとえば、UTCをAmerica/New_York(EST)時間に変換する例を次に示します。

php > print date("r", $unixTime);
Tue, 20 Dec 2011 12:54:48 -0500
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

12月の-0500オフセットに注意してください。 7月1日のように、時間の値を夏の日付に変更すると、夏時間(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を使用している場合、箱から出して動作するDateTimeタイプに気付いたかもしれません。それは日付のように見え、匂いがします、そしてあなたがそれが日付だと言うなら、あなたは正しいです。ただし、MySQLからPHPに選択したら、実際に持っているのは、日付のように見える文字列だけです。タイムゾーンの認識はなく、人間がそれを見る必要がある前に人間の使用のためにフォーマットされています。 はい、MySQLには多くの日付のフォーマット関数があることは知っていますが、すでにPHPを使用しています。ご覧のとおり、PHPは日付形式の処理に優れています。なぜデータベースから直接フォーマットする必要があるのですか?いくつかの異なる変換と形式を適用する必要があるかもしれません。人間がそれを見ようとしているときのみ日付をフォーマットすることが最善です。

<code>mktime(hour, minute, second, month, day, year, isDST)</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このシンプルなスクリプトを実行すると、DateTimeフィールドから得られるのは、タイムゾーン情報のないフォーマットされた文字列であることがわかります。

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を実行しているサーバーの現地時間です。 1つのタイムゾーンに1つのサーバーのみが関与している場合、DateTimeはほとんどのニーズに適している可能性があり、私はあなたに非常にうらやましいです。では、PHPとMySQLを使用して日付とタイムゾーンを処理するにはどうすればよいですか? UNIXタイムスタンプとして日付を保存します。 UNIX時間は1970年1月1日のUTC以降の秒数であることがすでにわかっているため、これにより一定のタイムゾーンが得られ、PHPの多くの日付関数がUNIXタイムスタンプに基づいていることに気付いたかもしれません。 MySQLを使用するとき、私は通常、日付を整数署名したものとして保存するテーブル列を作成します。日付を挿入するときは、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を実行しているサーバーのタイムゾーンには時間がかかります。Webアプリケーションのテンプレート/ビューレベルに到達し、それを見る準備をするまで、いかなるタイプのフォーマットもしないことをお勧めします。

sean@beerhaus:~$ php -a
php > print time();
1324402770
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
タイムゾーンにまたがる任意のアプリケーションでは、通常、ユーザーのカスタムタイムゾーン設定を追跡し、

値に読み取るテーブルがあります。以下に示すようにセッションエントリがあるとします:$_SESSION

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)を簡単に変換できます。

php > print date("r", $unixTime);
Tue, 20 Dec 2011 12:54:48 -0500
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
これにより、日付「月、2012年1月16日12:03:49 -0600」が日付になります。 -0600は、UTCより6時間遅れており、UTCのオフセットは0であることを示しています。タイムゾーンをアメリカ/los_angelesに設定すると、生成された日付は次のとおりです。

およびAmerica/New_Yorkが生成します:
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
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

<code>mktime(hour, minute, second, month, day, year, isDST)</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
概要

日付とタイムゾーンの処理は、多くのプログラマーの日常生活の一部ですが、PHPの強力で使いやすい日付ライブラリを使用できる場合、心配する必要はありません。 UNIXタイムスタンプを取得する方法、考えられる形式で日付をフォーマットする方法、英語の日付表現をタイムスタンプに解析する方法、タイムスタンプに期間を追加する方法、およびタイムゾーン間の変換方法を学びました。この記事に2つの主要なポイントがある場合、1)時間を解決すること、2)PHPとMySQLを使用するときのすべての日付のベースタイムゾーンとしてUTCに固執することです。 UTCに基づいた皆さんのアイデアは、PHPとMySQLに適用されるだけではありません。自分が別の言語で働いていることに気付いた場合、「くそ、なぜ彼らはPHPと同じことをすることができないのですか?」

yakobchuk vasyl / shutterstockの写真

(入力テキストのFAQセクションと同様に、PHPの日付と時間を処理するためのFAQセクションについて、FAQセクションをここに追加する必要があります。スペースの制限のためにここに追加しませんでした。

以上がPHPおよびMySQLで日付と時間を操作しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート