日付や時刻の"01"を" 1"に変換したいです。
下記のような問題で悩んでいます。何かよいアイディアがありましたら教えて下さい。
【要件】
・SimpleDateFormatで指定された書式の文字列にした後、年月日時分秒ミリ秒の"01"~"09"を" 1"~" 9"のように前0を半角スペースに一括変換したい(年は書式がyy形式の場合のみ)。
・SimpleDateFormatへの書式はエラーが起きない限りどんなものでも受け入れる(通常、書くわけがない書式についても)。
例)
"yyyy/MM/dd HH:mm:ss:SSS"
"'yyyy/MM/dd HH:mm:ss:SSS形式:'yyyy/MM/dd HH:mm:ss:SSS"
※''の中にあるMMはテキストなので英字のまま。
"yyyy/MMMMMMMMMMMMMMMMMMMM/dd HH:mm:ss:SSS"
※Mの数は不明
"yyyy/MM/dd MM MM HH:mm:ss:SSS"
※月の表示指定が複数
引数 :日付(yyyyMMddHHmmssSSS形式), SimpleDateFormatへの書式
戻り値:SimpleDateFormatで変換後に"01"~"09"を" 1"~" 9"にした文字列
自分なりの検討案としては下記になります。
a.引数の書式をそのままSimpleDateFormatに引き渡ずに、一部修正してから呼び出す。
例)"yyyy/MM/dd HH:mm:ss:SSS"→yyyy/_M/_d _H:_m:_s:__S"
※"_"は半角スペースです。
実際はMやdなどが2桁になる場合は変換しません。
かなりごりごり200行ぐらい試しに書いたのですが、対応できないケースが出てきてその都度エンドレス状態です。
ちょっとこのまま実装するわけにいきません。いつバグがでるか・・・。
b.SimpleDateFormatで変換後に年月日時分秒ミリ秒に該当する箇所に"01"~"09"があったら置換する。
引数の書式からMMやddのindexを保持して、SimpleDateFormatで変換後の該当indexに置換。
例)
書式:"yyyy/MM/dd_HH:mm:ss:SSS"
日付:"20090101010101001"
"2009/01/01_01:01:01:001"→"2009/_1/_1__1:_1:_1:__1"
※"_"は半角スペースです。
但し前提として、書式とSimpleDateFormatで変換後の文字列が1対1になっている必要があります。
単純な例ですと
書式:"yyyy/MMMM/dd HH:mm:ss:SSS"
書式のddは11~12桁目ですが、SimpleDateFormatで変換後は下記のようにインデックスがずれます。
"2009/1月/01 01:01:01:001"
"2009/12月/01 01:01:01:001"
もしかしたら下記のような感じで吸収できるのかもしれませんが、ちょっと個人的に出来そうに思えませんでした。
月が1桁 かつ 書式が"M"の場合
月が1桁 かつ 書式が"MM"の場合
月が1桁 かつ 書式が"MMM"の場合
月が1桁 かつ 書式が"MMMM"の場合
月が1桁 かつ 書式が"Mxn"の場合
月が2桁 かつ 書式が"M"の場合
月が2桁 かつ 書式が"MM"の場合
月が2桁 かつ 書式が"MMM"の場合
月が2桁 かつ 書式が"MMMM"の場合
月が2桁 かつ 書式が"Mxn"の場合
ここ1,2週間ほど煮詰まっています。どなたかアドバイス頂けると助かります。
自分的なネックは書式が限りなくフリー形式なところです。