LoginSignup
9
9

More than 5 years have passed since last update.

[PHP5.1+] PHPで日付・時間操作をカンタンに出来るAPIの紹介

Last updated at Posted at 2013-05-22

PHP で日付や時刻の計算を行う時, 皆様はどんなやり方をしていますか?
おそらく date(), time(), strtotime() などの関数や DateTime クラスなどで試行錯誤している方が大半なのではと思います.
個人的にもっと直感的でラクに使える日付・時刻操作 API が欲しかったので作りました.
以下, 自作の汎用 PHP クラスライブラリ (PEACH) の紹介です.

※この記事は PHP5.1 系, 5.2 系の環境が対象です. PHP 5.3 以上をお使いの方は バージョン 2 系の解説記事 をご覧ください.

導入

  1. http://trashtoy.github.io/peach/ から最新版 (1.0.1) をダウンロードしましょう. (2014/08/26 現在)
  2. ZIP ファイルを展開し, src ディレクトリを適当なディレクトリに配置します.
  3. PHP ファイルで以下のように autoload.php を読み込むだけで OK です.
<?php
require_once("/path/to/peach/src/autoload.php");

// Your code here...

時間オブジェクトの生成

時間オブジェクトには

  • Peach_DT_Date (日付)
  • Peach_DT_Datetime (日付時刻, 分まで)
  • Peach_DT_Timestamp (日付時刻, 秒まで)

の 3 種類があります.

<?php
require_once("/path/to/peach/src/autoload.php");

$d1 = new Peach_DT_Date(2012, 5, 21);
$d2 = new Peach_DT_Datetime(2012, 5, 21, 7, 34);
$d3 = new Peach_DT_Timestamp(2012, 5, 21, 7, 34, 45);

var_dump($d1->format()); // string(10) "2012-05-21"
var_dump($d2->format()); // string(16) "2012-05-21 07:34"
var_dump($d3->format()); // string(19) "2012-05-21 07:34:45"

フィールドの参照

get メソッドの引数に year, month, date, hour, minute, second などの文字列を指定することで, 対応するフィールドを取得することが出来ます.

<?php
require_once("/path/to/peach/src/autoload.php");

$date = new Peach_DT_Date(2012, 5, 21);
var_dump($date->get("year"));  // int(2012)
var_dump($date->get("month")); // int(5)
var_dump($date->get("date"));  // int(21)

フィールドの変更

set, add などのメソッドを使ってフィールドの変更が出来ます.
これらのメソッドは, 自身のフィールドを変更するのではなく, 新しい時間オブジェクトを返します.
PHP 5.5 で導入された DateTimeImmutable クラスの挙動に近いです.

set メソッド

日付の「月」の値を 5 から 10 に変更します.

<?php
require_once("/path/to/peach/src/autoload.php");

$date = new Peach_DT_Datetime(2012, 5, 21, 7, 34);
var_dump($date->format()); // string(16) "2012-05-21 07:34"
$test = $date->set("month", 10);
var_dump($test->format()); // string(16) "2012-10-21 07:34"

add メソッド

とある時刻の 100 分後を計算します.

<?php
require_once("/path/to/peach/src/autoload.php");

$date = new Peach_DT_Datetime(2012, 5, 21, 7, 34);
var_dump($date->format()); // string(16) "2012-05-21 07:34"
$test = $date->add("minute", 100);
var_dump($test->format()); // string(16) "2012-05-21 09:14"

複雑な操作

メソッドチェーンを使って「今から 1 年後の 1 週間前の正午」を計算します.

<?php
require_once("/path/to/peach/src/autoload.php");

use Peach\DT\Datetime;

$date = Peach_DT_Datetime::now();
var_dump($date->format()); // string(16) "2014-12-16 21:37"
$test = $date->add("year", 1)->add("date", -7)->setAll(["hour" => 12, "minute" => 0]);
var_dump($test->format()); // string(16) "2015-12-09 12:00"

時間オブジェクトと文字列の相互変換

先ほどのコード例にもありましたが, format メソッドを使ってオブジェクトを文字列に変換出来ます.

<?php
require_once("/path/to/peach/src/autoload.php");

$d1 = new Peach_DT_Date(2012, 5, 21);
$d2 = new Peach_DT_Datetime(2012, 5, 21, 7, 34);
$d3 = new Peach_DT_Timestamp(2012, 5, 21, 7, 34, 45);
var_dump($d1->format());   // string(10) "2012-05-21"
var_dump($d2->format());   // string(16) "2012-05-21 07:34"
var_dump($d3->format());   // string(19) "2012-05-21 07:34:45"

文字列から時間オブジェクトを生成するには parse メソッドを使います.

<?php
require_once("/path/to/peach/src/autoload.php");

$d1 = Peach_DT_Date::parse("2012-05-21");
$d2 = Peach_DT_Datetime::parse("2012-05-21 07:34");
$d3 = Peach_DT_Timestamp::parse("2012-05-21 07:34:45");
var_dump($d1->format()); // string(10) "2012-05-21"
var_dump($d2->format()); // string(16) "2012-05-21 07:34"
var_dump($d3->format()); // string(19) "2012-05-21 07:34:45"

ユーザー指定の書式が使えます

Java の SimpleDateFormat クラスのように, ユーザー指定の書式で文字列と時間オブジェクトの変換が出来ます.

<?php
require_once(dirname(__DIR__) . "/dev/PEACH/src/autoload.php");

$f    = new Peach_DT_SimpleFormat("Y年n月j日 H:i:s");
$date = Peach_DT_Timestamp::parse("2012年5月21日 07:34:45", $f); // 第 2 引数にフォーマットを指定する
var_dump($date->format());                                       // string(19) "2012-05-21 07:34:45"

$test = $date->set("month", 10)->add("hour", -5);
var_dump($test->format());                                       // string(19) "2012-10-21 02:34:45"
var_dump($test->format($f));                                     // string(23) "2012年10月21日 02:34:45"

HTTP-Date の入出力も出来ます

HTTP ヘッダーの Last-ModifiedIf-Modified-Since などの取り扱いも簡単です.

<?php
require_once(dirname(__DIR__) . "/dev/PEACH/src/autoload.php");

// php.ini で date.timezone = "Asia/Tokyo" がセットされている前提です

$text = "Sun, 20 May 2012 22:34:45 GMT";          // If-Modified-Since や Last-Modified はこのような書式
$f    = new Peach_DT_HttpDateFormat();
$date = Peach_DT_Timestamp::parse($text, $f);     // 第 2 引数にフォーマットを指定する
var_dump($date->format());                        // string(19) "2012-05-21 07:34:45"
$test = $date->set("month", 10)->add("hour", -5);
var_dump($test->format());                        // string(19) "2012-10-21 02:34:45"
var_dump($test->format($f));                      // string(29) "Sat, 20 Oct 2012 17:34:45 GMT"

詳細について

より詳しい使い方や仕様は http://trashtoy.github.io/peach/li_DT.html にあります.

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9