特定のタイムゾーンで作成された日付を解析し、形式に変換して返します。変換は機能しますが、タイムゾーンオフセットは常に+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; }
基本的に、[createDate()メソッドで]日付文字列を解析すると、元のゾーンが失われます。 Joda-Time を使用すると、任意のゾーンを使用して日付をフォーマットできますが、元のゾーンを保持する必要があります。
CreateDate()メソッドでは、 DateTimeFormatter "df"は文字列にあったゾーンを返すことができます。 withOffsetParsed() メソッドを使用する必要があります。次に、 DateTime を取得したら、 getZone() を呼び出します。このゾーンをどこかに保存するか、何らかの方法でフォーマットルーチンに渡す場合は、DateTimeFormatter "withZone"を作成し、そのゾーンをフォーマットに使用するゾーンとして指定することで使用できます。
デモとして、単一のメソッドのサンプルコードを次に示します。うまくいけば、コードを実行したい方法に変更するのに役立つでしょう。
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));
}
これを試して。
ISODateTimeFormat.dateTimeParser().parseDateTime(dateString),
次に、それを希望する形式に変換します。
Format val formatter = DateTimeFormat.forPattern( "yyyy-MM-dd HH:mm:ss.SSSZZ")を使用します