2011-02-04 7 views
0

2種類の文字列を、構文解析にはSimpleDateFormat、フォーマット用にはorg.apache.commons.lang.time.DateFormatUtilsを使用してISO形式に変換します(これらはISOフォーマッタをすぐに使用できるためです)。

解析するパターン文字列は、M/d/y H:md.M.y H:mです。変換する典型的な文字列は4/14/2009 11:22または4.14.2009 11:22のように見えます。datetime文字列を解析するときのタイムゾーンの不一致

Date date = FORMAT_SLASH.parse(old); 

それが出力用にフォーマットされています。解析された文字列からDateを作成した後

FastDateFormat isoFormatter = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT 

SimpleDateFormat SLASH = new SimpleDateFormat(PATTERN_S, Locale.getDefault()); 
SimpleDateFormat DOT = new SimpleDateFormat(PATTERN_D, Locale.getDefault()); 

は私がフォーマッタを取得し、次のように私はパーサを初期化します。

isoFormatter.format(date) 

奇妙なことがある:スラッシュとStringが変換されたとき、出力が(正しい)2009-04-14T11:42:00+01:00のように見えますが、ドットでStringが変換されたとき、出力がフィンランドと南アフリカ間のどこかに自分のタイムゾーンをシフト、2010-02-14T11:42:00+02:00のように見えます、2010年から2月までの月間

ここで何が問題になりますか?

EDIT:実際の出力に合うように出力文字列を変更しました(あなたはカットアンドペースト)。その理由は、私が気付かなかったパターン文字列に交換されたMdでした。 14は完璧な正当な月と思われます。翌年の2月となり、非寛大な設定でもフォーマッターはそれを拒否することができません。タイムシフトの問題は解決され、TimeZoneの変更の理由はJim Garrisonによって提供されます。ありがとうございますAhmadとジム

+0

ドット文字列は本当に '4.14.2009 11:22'ですか?これは書式文字列には適合しません。 –

+1

あなたの投稿を再読し、もしあれば、m/d/yとd.m.yの関係にあるエラーを修正して、私たちに正しい入出力を教えてください。私は、ある日付が月と日に逆順に解釈される問題があると考えています。結果の日付(2010/02/04?)がDST境界の反対側にある場合は、実際に1時間のオフセットを得ることができます。 –

+0

@Paulo Ebermann - それは本当に - それは変換します。私はそれが寛大な設定だと思ったが、パターンは厳密な設定であっても一致するようだ。 – kostja

答えて

1

あなたの例はM.d.y H:mを意味していますが、これはParseExceptionを投げたと思われますが、タイムゾーンの問題が発生します。

+0

例外スローはDateFormat.setLenient(false)で調整できます。しかし、交換された月と日の値を与えることは、ここで与えられた出力を実際に生成しません。 –

関連する問題