PHP
日付と時間の使用
サーチ…
構文
- 文字列の日付(文字列$ format [、int $ timestamp = time()])
- int strtotime(string $ time [、int $ now])
英語の日付の説明を日付形式に解析する
date()
と組み合わされたstrtotime()
関数を使うと、異なる英語のテキスト記述を日付に解析することができます:
// Gets the current date
echo date("m/d/Y", strtotime("now")), "\n"; // prints the current date
echo date("m/d/Y", strtotime("10 September 2000")), "\n"; // prints September 10, 2000 in the m/d/Y format
echo date("m/d/Y", strtotime("-1 day")), "\n"; // prints yesterday's date
echo date("m/d/Y", strtotime("+1 week")), "\n"; // prints the result of the current date + a week
echo date("m/d/Y", strtotime("+1 week 2 days 4 hours 2 seconds")), "\n"; // same as the last example but with extra days, hours, and seconds added to it
echo date("m/d/Y", strtotime("next Thursday")), "\n"; // prints next Thursday's date
echo date("m/d/Y", strtotime("last Monday")), "\n"; // prints last Monday's date
echo date("m/d/Y", strtotime("First day of next month")), "\n"; // prints date of first day of next month
echo date("m/d/Y", strtotime("Last day of next month")), "\n"; // prints date of last day of next month
echo date("m/d/Y", strtotime("First day of last month")), "\n"; // prints date of first day of last month
echo date("m/d/Y", strtotime("Last day of last month")), "\n"; // prints date of last day of last month
日付を別の形式に変換する
基礎
ある日付形式を別の形式に変換する単純な方法は、 date()
でstrtotime()
を使用することです。 strtotime()
は日付をUnixタイムスタンプに変換します。そのUnixタイムスタンプをdate()
に渡して新しいフォーマットに変換することができます。
$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);
または1つのライナーとして:
$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));
strtotime()
は、日付が有効な形式であることを要求します 。有効な書式を指定しないとstrtotime()
falseを返し、日付は1969-12-31になります。
DateTime()
を使用する
PHP 5.2より、PHPはDateTime()
クラスを提供しました。このクラスは、日付(および時刻)を処理するためのより強力なツールを提供します。 DateTime()
を使って上記のコードを書き直すことができます:
$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');
Unixタイムスタンプの操作
date()
は2番目のパラメータとしてUnixタイムスタンプをとり、フォーマットされた日付を返します:
$new_date_format = date('Y-m-d H:i:s', '1234567890');
DateTime()は、タイムスタンプの前に@
追加することで、Unixタイムスタンプで動作します:
$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');
あなたが持っているタイムスタンプがミリ秒( 000
で終わるかもしれません、そして/またはタイムスタンプが13文字の長さであるならば)あなたはそれを別のフォーマットに変換することができる前に秒に変換する必要があります。これを行うには2つの方法があります:
最後の3桁のトリミングはいくつかの方法で達成できますが、 substr()
を使うのが最も簡単です:
$timestamp = substr('1234567899000', -3);
- substrを1000で割る
タイムスタンプを1000で割って秒単位に変換することもできます。タイムスタンプが大きすぎて32ビットシステムで数学を行うには、 BCMathライブラリを使用して数学を文字列として行う必要があります。
$timestamp = bcdiv('1234567899000', '1000');
Unixタイムスタンプを取得するには、Unixタイムスタンプを返すstrtotime()
を使用します:
$timestamp = strtotime('1973-04-18');
DateTime()では、 DateTime::getTimestamp()
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();
PHP 5.2を使用している場合は、 U
書式設定オプションを使用することができます。
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');
非標準的であいまいな日付形式で作業する
残念ながら、開発者が作業しなければならないすべての日付が標準形式ではありません。幸いにも、PHP 5.3はそのための解決策を私たちに提供しました。 DateTime::createFromFormat()
は、日付文字列がどのような形式であるかをPHPに伝えることができるので、 DateTime::createFromFormat()
操作できるようにDateTimeオブジェクトに正常に解析できます。
$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');
PHP 5.4では、 DateTime()
コードをワンライナーに変換するためのインスタンス化時のクラスメンバーアクセスを追加しました。
$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');
残念ながら、これはDateTime::createFromFormat()
まだ動作しません。
日付形式の事前定義定数の使用
PHP 5.1.0以降、従来の日付書式文字列ではなく、 date()
Date形式にあらかじめ定義された定数を使用することができます。
定義済みの日付フォーマット定数
DATE_ATOM
- Atom(2016-07-22T14:50:01 + 00:00)
DATE_COOKIE
- HTTP Cookies(金曜日、22-7月-16 14:50:01 UTC)
DATE_RSS
- RSS(Fri、22 Jul 2016 14:50:01 +0000)
DATE_W3C
- World Wide Web Consortium(2016-07-22T14:50:01 + 00:00)
DATE_ISO8601
- ISO-8601(2016-07-22T14:50:01 + 0000)
DATE_RFC822
- RFC 822(Fri、22 Jul 16 14:50:01 +0000)
DATE_RFC850
- RFC 850(金曜日、22-7月-16 14:50:01 UTC)
DATE_RFC1036
- RFC 1036(Fri、22 Jul 16 14:50:01 +0000)
DATE_RFC1123
- RFC 1123(Fri、22 Jul 2016 14:50:01 +0000)
DATE_RFC2822
- RFC 2822(Fri、22 Jul 2016 14:50:01 +0000)
DATE_RFC3339
- DATE_RFC3339
同じです(2016-07-22T14:50:01 + 00:00)
使用例
echo date(DATE_RFC822);
これが出力されます: Fri、22 Jul 16 14:50:01 +0000
echo date(DATE_ATOM,mktime(0,0,0,8,15,1947));
これにより、 1947-08-15T00:00:00 + 05:30
2つの日時の違いを取得する
最も実現可能な方法は、 DateTime
クラスを使用することです。
例:
<?php
// Create a date time object, which has the value of ~ two years ago
$twoYearsAgo = new DateTime("2014-01-18 20:05:56");
// Create a date time object, which has the value of ~ now
$now = new DateTime("2016-07-21 02:55:07");
// Calculate the diff
$diff = $now->diff($twoYearsAgo);
// $diff->y contains the difference in years between the two dates
$yearsDiff = $diff->y;
// $diff->m contains the difference in minutes between the two dates
$monthsDiff = $diff->m;
// $diff->d contains the difference in days between the two dates
$daysDiff = $diff->d;
// $diff->h contains the difference in hours between the two dates
$hoursDiff = $diff->h;
// $diff->i contains the difference in minutes between the two dates
$minsDiff = $diff->i;
// $diff->s contains the difference in seconds between the two dates
$secondsDiff = $diff->s;
// Total Days Diff, that is the number of days between the two dates
$totalDaysDiff = $diff->days;
// Dump the diff altogether just to get some details ;)
var_dump($diff);
また、2つの日付を比較する方がはるかに簡単です。次のような比較演算子を使用します。
<?php
// Create a date time object, which has the value of ~ two years ago
$twoYearsAgo = new DateTime("2014-01-18 20:05:56");
// Create a date time object, which has the value of ~ now
$now = new DateTime("2016-07-21 02:55:07");
var_dump($now > $twoYearsAgo); // prints bool(true)
var_dump($twoYearsAgo > $now); // prints bool(false)
var_dump($twoYearsAgo <= $twoYearsAgo); // prints bool(true)
var_dump($now == $now); // prints bool(true)