FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

日付/時刻→文字列変換ライブラリ

日付/時刻のデータを整形した文字列に変換するライブラリを作成しました。

前回の数値→文字列変換関数と合わせて,「書式指定付き文字列変換ライブラリ 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" -> "日曜日"