Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

文字列からナノ秒までパースしたい

SimpleDateFormatでparseしても
Date型ではミリ秒までしか保持できないため
2011/10/01 13:59:59.123456の文字列が
2011/10/01 13:59:59.456に変換されてしまう

SimpleDateFormatを継承してTimestamp型にパースするクラスを作成しようかと思いますが、ほかに方法はありますか?
フォーマットが複数あるため、単純に後ろから7文字をsubstringしてTimestampにsetNanosすることはできません

6

回答

7495

閲覧

6件の回答

評価

0

>単純に後ろから7文字
じゃなくて、ピリオドの後ろに4文字以上あるかどうかじゃないの。

SimpleDateFormatを継承するので良い気はするけど、単なるユーティリティメソッドでもいいかもね。

評価

0

ん?

. が存在しない。
→そのまま時間に
→ ミリとナノを0にする。

. が存在する
→ スプリットする。
→ 秒未満部を桁数制御する。
→ ミリとナノを計算する。


なにか問題が?

あと

2011/10/01 13:59:59.456

ではなく

2011/10/01 13:59:59.123

よね?

評価

0

ご回答ありがとうございます。
返事が遅れまして申し訳ありません。

複数あるフォーマットの中には
2011-11-01 13:59:59.12345GMT+0800
といったフォーマットもあるため
ピリオド以降、○桁決め打ちといったことができませ
んでした

説明不足で申し訳ありません。

評価

0

桁数違うから別フォーマットっていってるのかとおおったら、完全別フォーマットか。

同じ場所から同じファイルで別フォーマットはありえないはずだから。
そのファイル取り込み処理毎にパースするかユーティリティ作成(条件式によるパース)

評価

0

最初の書き込みでは、ミリ秒の問題でしかなかったんだがなあ。
すでに挙げられてるように、何らかの判定をもってパースを分けることもある。
パースする順番を考えて例外前提でループでやることもある。
例外出たら次のフォーマットって。

パーサーを完全に自前で用意することもある。
いずれにしても形式による。

普通は別のフィールドに、形式の指示子を持たせるところだけどなー。

評価

0

>パースする順番を考えて例外前提でループでやることもある。
>例外出たら次のフォーマットって。

正規表現チェックしてからやろうよ。
→例外前提

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。