日付を文字列にするための書式を比較してみた (php と Ruby 編) post

php を使っている時に、日付を書式化する場合、 date() 関数と strftime() 関数があって、どっち使うべきだろうか、とか片方のフォーマットは他方でどれだっけ?とか、まあようするになんでに種類あるんだろう?って思うわけです。

で、対応をまとめてみました。

ほかの言語も調べてみると Ruby の方が色々とフォーマットが追加されてたりするので、比較対象として追加してあります。

書式の比較

ざっと確認したところ、大まかに

  • php の date()
  • php の strftime() 系 Python や Perl や Linux の strftime() 関数(拡張なし)
  • Ruby の Time#strftime() 系 Linux の DATE コマンド や strftime() 関数(拡張あり)

の3種類があるようです。

さてはて php の date() は一体どこから出てきたのでしょうね。

ともかく、 php と Ruby の関数の書式をまとめてみました。

php:strftime php:date ruby:Time#strftime 説明
%a D %a 短縮された曜日の名前
%A l %A 完全な曜日の名前
%d d %d 2桁0埋めの日付
%e %e 2桁空白埋めの日付
%j %j 3桁0埋め1開始の年間の通算日
%u N %u 月曜を1で日曜を7とする曜日
%w w %w 日曜を0で土曜を6とする曜日
%U %U 最初の日曜を1開始とする年間の通算週
%V W %V 最初の月曜を1開始とする年間の通算週、53週目は年をまたがる
%W %W 最初の月曜を1開始とする年間の通算週
%b, %h M %b, %h 短縮された月の名前
%B F %B 完全な月の名前
%m m %m 2桁0埋めの月
%C %C 2桁0埋めの世紀
%g 2桁であらわした年。ISO-8601:1988 標準形式
%G o %g の4桁完全版
%y y %y 2桁0埋めの年のしも2桁
%Y Y %Y 4桁0埋めの年
%H H %H 2桁0埋めの24時間制の時間
%k %k 2桁空白埋めの24時間制の時間
%I h %I 2桁0埋めの12時間制の時間
%l %l 2桁空白埋めの12時間制の時間
%M i %M 2桁0埋めの分
%p A %p 指定した時刻に応じた大文字の 'AM' あるいは 'PM'
%P a %P 指定した時刻に応じた小文字の 'am' あるいは 'pm'
%r %r "%I:%M:%S %p" と同じ
%R %R "%H:%M" と同じ
%S s %S 2桁0埋めの秒
%T, %X %T, %X "%H:%M:%S" と同じ
%z O %z タイムゾーン。UTC/GMTからのオフセット
%Z T %Z タイムゾーン
%c %c 日付と時刻
%D, %x %D, %x "%m/%d/%y" と同じ
%F %F "%Y-%m-%d" と同じ
%s U %s Unix エポックからのタイムスタンプ
%n %n 改行文字 ("\n")
%t %t タブ文字 ("\t")
%% %% パーセント文字 ("%")
%a, %d %b %Y %T %z r %a, %d %b %Y %T %z RFC 2822 フォーマットされた日付
j %-e 左寄せの日
S 英語形式の序数を表すサフィックス(stやndなど)
z 左寄せで0開始の年間の通算日
n %-m 左寄せの月
t 指定した月の日数
L 閏年であるかどうか
B Swatch インターネット時間
g %-l 左寄せの12時間制の時間
G %-H 左寄せの24時間制の時間
u %6N 6桁0埋めのマイクロ秒
e タイムゾーン識別子
I サマータイム中か否か
P %:z タイムゾーン。コロンが入ったUTC/GMTからのオフセット
Z タイムゾーンのオフセット秒数
c %FT%T%:z ISO 8601 日付
%L, %3N 3桁0埋めのミリ秒
%N 9桁0埋めのナノ秒
%v VMS形式の日付 (%e-%b-%Y)
%::z タイムゾーン。コロンが入った秒まで含むUTCからのオフセット

表にして比較してみると、 php の date() 関数は若干サポートしているフォーマットが少ないですが、逆に特殊な内容をサポートしていたりと、なかなかおもしろいと思います。

両方が合わさると最強ではないかと思わなくもないですが、英字1文字で対応するには厳しい気もしますね。

比較は、手でやるのは面倒だったのでスクリプトを組んで調べましたが、まあ、これぐらいなら手でやっても良かったかもしれません。

ほかの言語を追加で調べる場合には、楽ができそうですが。

スクリプトの利用方法

利用方法は下記の

を同じところにダウンロードして _format-diff.php を実行するだけです。

$ wget https://gist.githubusercontent.com/sharkpp/2bdf0b6a70fc08044b01b7089e6ef023/raw/bffcab5b2ac52c5d2878a351f6626cc3a431baf0/
$ wget https://gist.githubusercontent.com/sharkpp/84deb455f9e1ffbc50f8cf1d5a0c399b/raw/5b8156bb66a21477ea2f6214721f8a7d46082379/
$ wget https://gist.githubusercontent.com/sharkpp/0426f8dd6650083dc30768fc9f3f3c61/raw/9404cd04f9bde929e0d61c97408f0a89a566a449/
$ wget https://gist.githubusercontent.com/sharkpp/7f45f212b1d58609bf7ee19164630452/raw/07c5e4093ad8db4af4048639fa7194b732c5387c/
$
$ php _format-diff.php
|php:strftime|php:date|ruby:Time#strftime|説明|
|:-:|:-:|:-:|-|
|  %a  |  D  |        %a        ||
|  %A  |  l  |        %A        ||

実際のコード(ちょっと長い)

参考


 /  変更履歴  /  Permalink  /  このエントリーをはてなブックマークに追加
カテゴリ: まとめ  /  タグ: php, ruby, bash, POSIX, まとめ