2種類の文字列を、構文解析にはSimpleDateFormat
、フォーマット用にはorg.apache.commons.lang.time.DateFormatUtils
を使用してISO形式に変換します(これらはISOフォーマッタをすぐに使用できるためです)。
解析するパターン文字列は、M/d/y H:m
とd.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:実際の出力に合うように出力文字列を変更しました(あなたはカットアンドペースト)。その理由は、私が気付かなかったパターン文字列に交換されたM
とd
でした。 14
は完璧な正当な月と思われます。翌年の2月となり、非寛大な設定でもフォーマッターはそれを拒否することができません。タイムシフトの問題は解決され、TimeZoneの変更の理由はJim Garrisonによって提供されます。ありがとうございますAhmadとジム
ドット文字列は本当に '4.14.2009 11:22'ですか?これは書式文字列には適合しません。 –
あなたの投稿を再読し、もしあれば、m/d/yとd.m.yの関係にあるエラーを修正して、私たちに正しい入出力を教えてください。私は、ある日付が月と日に逆順に解釈される問題があると考えています。結果の日付(2010/02/04?)がDST境界の反対側にある場合は、実際に1時間のオフセットを得ることができます。 –
@Paulo Ebermann - それは本当に - それは変換します。私はそれが寛大な設定だと思ったが、パターンは厳密な設定であっても一致するようだ。 – kostja