PHPのstrtotimeが対応しない書式の日付を正規化する『超strtotime』を公開しました

PHPMatsuri 2012 というイベントに参加して作りました。

これは何

PHP の strtotime() では対応できない書式の日付を正規化して
JSON で返すサービスです。

strtotime はできる子

strtotime はこういう関数で

PHP: strtotime – Manual

英文形式の日付を Unix タイムスタンプに変換する

なかなかできる子です。

PHP マニュアルのサンプルはこうなってるけど

echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";

こういうのもいけますね。

//区切りなしの日付でもいける
echo strtotime("20121104");
//1351954800

//西暦下2桁で書くと日付と時刻の両方に取っちゃうけど一応いける
echo strtotime("121104");
//1351998664 = 2012/11/04 12:11:04

//日本語でよく使うスラッシュ区切りもいける
echo strtotime("2012/11/04");
//1351954800

strtotime が苦手なこと

ただしこういうのが苦手です。

//ドット区切りは苦手
echo strtotime("2012.11.04");
//false

//漢字は苦手
echo strtotime("2012年11月4日");
//false

//元号も苦手
echo strtotime("H24-11-04");
//1730649600 が返ってくるけど
//これは 2024-11-04 だ。

そこで、超strtotime()

http://strtoti.me/ の後に日付をつけてアクセスすると
正規化された情報を JSON で返します。

http://strtoti.me/1974.4.13

{
    "year": 1974,
    "month": 4, 
    "day": 13, 
    "mmdd": "0413", 
    "timestamp": 135010800
}

JSONP 対応

http://strtoti.me/S49.04.13?callback=birthday

birthday({"gen":"\u662d\u548c
","year":1974,"month":4,"day"
:13,"mmdd":"0413","gen_year":49,"show_year":"\u662d\u548c4
9\u5e74","timestamp":135010800})

漢数字対応

http://strtoti.me/二千十二年十一月四日

{
    "year": 2012,
    "month": 11, 
    "day": 4, 
    "mmdd": "1104", 
    "timestamp": 1351954800
}

元号対応

http://strtoti.me/平成元年一月八日

{
    "gen": "平成", 
    "gen_year": 1, 
    "show_year": "平成元年", 
    "year": 1989,
    "month": 1, 
    "day": 8, 
    "mmdd": "0108", 
    "timestamp": 600188400
}

元号バリデーションつき

http://strtoti.me/大正20年5月5日

{
    "gen": "大正", 
    "gen_year": 20, 
    "show_year": "大正20年", 
    "year": 1931,
    "month": 5, 
    "day": 5, 
    "mmdd": "0505", 
    "notice": "大正は15年までです。", 
    "timestamp": -1220086800
}

http://strtoti.me/S64.1.31

{
    "gen": "昭和", 
    "gen_year": 64, 
    "show_year": "昭和64年", 
    "year": 1989,
    "month": 1, 
    "day": 31, 
    "mmdd": "0131", 
    "notice": "昭和64年は1月7日までです。", 
    "timestamp": 602175600
}

閏年バリデーションつき

http://strtoti.me/2013-02-29

{
    "show_year": "2013年", 
    "year": 2013、
    "month": 2, 
    "day": 29, 
    "mmdd": "0229", 
    "notice": "2013年の2月は28日までです。", 
    "timestamp": 1362063600
}

自問自答

Q: 日付だけ? 時刻は?

最初にも書きましたけど
これは PHPMatsuri in 福岡で作ったものです。
いまこの記事もそのイベント会場で書いてます。

日付にも対応しようと思ったら初日の夜になってしまい
これは日付とか言ってる場合じゃないなと思ったので
ラーメンを食べに行きました。

帰ったら対応しますたぶん。

Q: ソースコードは?

GitHub で公開するつもりですけど
現状のコードがいくらなんでもアンリーダブルすぎるので
ちょい待ってね。

Q: 何に使うの?

各自で決めてください。

発表のスライド

  • このエントリーをはてなブックマークに追加