web-dev-qa-db-ja.com

Joda Timeはタイムゾーンで日付を解析し、そのタイムゾーンを保持します

特定のタイムゾーンで作成された日付を解析し、形式に変換して返します。変換は機能しますが、タイムゾーンオフセットは常に+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; }
29
edwardmlyte

基本的に、[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));

  }
39
Darius X.

これを試して。

ISODateTimeFormat.dateTimeParser().parseDateTime(dateString), 

次に、それを希望する形式に変換します。

0
EricW

Format val formatter = DateTimeFormat.forPattern( "yyyy-MM-dd HH:mm:ss.SSSZZ")を使用します

0
frostcs