日付/時刻→文字列変換ライブラリ
日付/時刻のデータを整形した文字列に変換するライブラリを作成しました。
前回の数値→文字列変換関数と合わせて,「書式指定付き文字列変換ライブラリ 0.2版」としてまとめました。ここで配布していますので,よろしければ使ってみてください。
書式指定文字列の仕様についての検討
書式指定文字列の仕様を決めるにあたって,既存の書式指定文字列の仕様をいくつか確認してみましたが,見事にバラバラですね。
例えば,「年-月-日 時:分:秒」を24時間表記・0パディングありで指定すると,以下のようになります。
- .Net Framework
- yyyy-MM-dd HH:mm:ss
- Oracle
- YYYY-MM-DD HH24:MI:SS
- Perl
- %Y-%m-%d %H:%M:%S
以前作成した数値を文字列に変換するライブラリ(id:fet:20100914)では,「.Net Frameworkのカスタム数値書式指定文字列」に習ったので,今回も.Net Frameworkの流儀に合わせるのが筋だとは思ったのですが,.Netの書式指定文字列はとにかく覚えにくい。毎回使う度に,「年の“Y”は大文字だっけ?小文字だったっけ?」と首をひねることになります。
そこで今回は,以下の方針でオリジナルの仕様を考えました。
- .Net Frameworkの「カスタムDateTime書式指定文字列」をベースとする。
- しかし,我慢できない部分については修正する。
- 原則として,日付は大文字・時刻は小文字の書式指定文字を使用する(ISO 8601の表記に習った)。
- 例外として,12時間表記の「時」を示す書式指定文字は大文字とする(.Netとは意味が逆になるので注意)。
- 月名(MMM/MMMM)・曜日名(DDD/DDDD)については,新規に書式文字を割り当てた。
- .Netでサポートしていない,和暦・年号(明治/大正/昭和/平成)に対応した。
- 言語の切り替えに対応していないので,よく使いそうな名称をご都合主義で,英名・日本名混在で割り当てた。
決定した書式指定文字列の仕様
最終的には以下の仕様になりましたが,「我慢できない部分」が多かったので,「カスタムDateTime書式指定文字列」とは別物になってしまいました。
【利用可能な書式指定文字】 YY 2桁年(0パディングする) YYYY 桁年(0パディングする) M 月(0パディングしない) MM 月(0パディングする) B 月略名(Jan., Feb.,..., Dec.) BB 月正式名(1月, 2月,..., 12月) D 日(0パディングしない) DD 日(0パディングする) A 曜日略名(日, 月,..., 土) AA 曜日正式名(日曜日, 月曜日,..., 土曜日) G 年号略名(M, T, S, H) GG 年号正式名(明治, 大正, 昭和, 平成) E 和暦(0パディングしない) EE 和暦(0パディングする) h 時(24時間表記,0パディングしない) hh 時(24時間表記,0パディングする) H 時(12時間表記,0パディングしない) HH 時(12時間表記,0パディングする) m 分(0パディングしない) mm 分(0パディングする) s 秒(0パディングしない) ss 秒(0パディングする) t 午前/午後略名(AM, PM) tt 午前/午後正式名(午前, 午後) \<文字> エスケープ文字 '<文字列>', "<文字列>" リテラル文字列 その他の文字 結果の文字列にコピーされる。 【利用可能なエスケープ文字】 \b バックスペース(BS) \n 行送り(LF) \r 復帰(CR) \t 水平タブ(TAB) \u<HHHH> 16進数値[HHHH]を持つUnicode文字 \<文字> 文字自身
使用例
関数の使用例をいくつか示します。
例に出てくるtm_of_stringは,文字列で記述した日付/時刻を解析してUnix.tmレコードを返す関数です。ライブラリに同梱されています。
format_tm (tm_of_string "2010-10-23T15:21:10") "YYYY年MM月DD日" -> "2010年10月23日" format_tm (Unix.localtime (Unix.time ())) "hh:mm:ss" -> "15:24:35" format_tm (tm_of_string "1911-04-04") "GGEE年MM月DD日" -> "明治44年04月04日" format_tm (tm_of_string "2040-01-01") "AA" -> "日曜日"