特定のタイムゾーンで作成された日付を解析し、それを形式に変換して返したいと考えています。 変換は機能しますが、タイムゾーン オフセットは常に +0000 に設定され、必要に応じて時間差が加算/減算されます。 どのようにフォーマットしてオフセットを正しく維持できますか?
私はこれを期待しています: 2012-11-30T12:08:56.23+07:00
しかし、これを見て下さい: 2012-11-30T05:08:56.23+00:00
実装:
public static final String ISO_8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSZZ";
public static String formatDateToISO8601Standard(Date date) {
DateTime dateTime = new DateTime(date);
DateTimeFormatter df = DateTimeFormat.forPattern(ISO_8601_DATE_FORMAT);
return dateTime.toString(df);
}
テストクラス:
private static final String DATE_WITH_TIMEZONE = "30 11 2012 12:08:56.235 +0700";
private static final String EXPECTED_DATE_WITH_TIMEZONE = "2012-11-30T12:08:56.23+07:00";
@Test public void testFormattingDateWithSpecificTimezone() throws Exception {
String result = JodaDateUtil.formatDateToISO8601Standard(createDate(DATE_WITH_TIMEZONE));
assertEquals("The date was not converted correctly", EXPECTED_DATE_WITH_TIMEZONE, result); }
private Date createDate(String dateToParse) throws ParseException {
DateTimeFormatter df = DateTimeFormat.forPattern("dd MM yyyy HH:mm:ss.SSS Z");
DateTime temp = df.parseDateTime(dateToParse);
Date date = temp.toDate();
return date; }
ベストアンサー1
基本的に、[createDate() メソッドで] 日付文字列を解析すると、元のゾーンは失われます。ジョダタイム任意のゾーンを使用して日付をフォーマットできますが、元のゾーンを保持する必要があります。
createDate() メソッドでは、日付時刻フォーマッタ「df」は文字列上のゾーンを返すことができます。オフセット解析()方法。日付時刻、 電話取得ゾーン()このゾーンをどこかに保存するか、何らかの方法でフォーマット ルーチンに渡すと、DateTimeFormatter "withZone" を作成し、そのゾーンをフォーマットに必要なゾーンとして指定することで、そこで使用できます。
デモとして、1 つのメソッドのサンプル コードをいくつか示します。コードの実行方法を希望どおりに変更する際に役立つことを願っています。
public static void testDate()
{
DateTimeFormatter df = DateTimeFormat.forPattern("dd MM yyyy HH:mm:ss.SSS Z");
DateTime temp = df.withOffsetParsed().parseDateTime("30 11 2012 12:08:56.235 +0700");
DateTimeZone theZone = temp.getZone();
Date date = temp.toDate();
DateTime dateTime = new DateTime(date);
DateTimeFormatter df2 = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSZZ");
DateTimeFormatter df3 = df2.withZone(theZone);
System.out.println(dateTime.toString(df2));
System.out.println(dateTime.toString(df3));
}