日付を文字列にするための書式を比較してみた (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:strftimephp:dateruby:Time#strftime説明
%aD%a短縮された曜日の名前
%Al%A完全な曜日の名前
%dd%d2桁0埋めの日付
%e%e2桁空白埋めの日付
%j%j3桁0埋め1開始の年間の通算日
%uN%u月曜を1で日曜を7とする曜日
%ww%w日曜を0で土曜を6とする曜日
%U%U最初の日曜を1開始とする年間の通算週
%VW%V最初の月曜を1開始とする年間の通算週、53週目は年をまたがる
%W%W最初の月曜を1開始とする年間の通算週
%b, %hM%b, %h短縮された月の名前
%BF%B完全な月の名前
%mm%m2桁0埋めの月
%C%C2桁0埋めの世紀
%g2桁であらわした年。ISO-8601:1988 標準形式
%Go%g の4桁完全版
%yy%y2桁0埋めの年のしも2桁
%YY%Y4桁0埋めの年
%HH%H2桁0埋めの24時間制の時間
%k%k2桁空白埋めの24時間制の時間
%Ih%I2桁0埋めの12時間制の時間
%l%l2桁空白埋めの12時間制の時間
%Mi%M2桁0埋めの分
%pA%p指定した時刻に応じた大文字の 'AM' あるいは 'PM'
%Pa%P指定した時刻に応じた小文字の 'am' あるいは 'pm'
%r%r"%I:%M:%S %p" と同じ
%R%R"%H:%M" と同じ
%Ss%S2桁0埋めの秒
%T, %X%T, %X"%H:%M:%S" と同じ
%zO%zタイムゾーン。UTC/GMTからのオフセット
%ZT%Zタイムゾーン
%c%c日付と時刻
%D, %x%D, %x"%m/%d/%y" と同じ
%F%F"%Y-%m-%d" と同じ
%sU%sUnix エポックからのタイムスタンプ
%n%n改行文字 ("\n")
%t%tタブ文字 ("\t")
%%%%パーセント文字 ("%")
%a, %d %b %Y %T %zr%a, %d %b %Y %T %zRFC 2822 フォーマットされた日付
j%-e左寄せの日
S英語形式の序数を表すサフィックス(stやndなど)
z左寄せで0開始の年間の通算日
n%-m左寄せの月
t指定した月の日数
L閏年であるかどうか
BSwatch インターネット時間
g%-l左寄せの12時間制の時間
G%-H左寄せの24時間制の時間
u%6N6桁0埋めのマイクロ秒
eタイムゾーン識別子
Iサマータイム中か否か
P%:zタイムゾーン。コロンが入ったUTC/GMTからのオフセット
Zタイムゾーンのオフセット秒数
c%FT%T%:zISO 8601 日付
%L, %3N3桁0埋めのミリ秒
%N9桁0埋めのナノ秒
%vVMS形式の日付 (%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, まとめ