33

我想解析使用特定时区创建的日期,将其转换为格式并返回。转换有效,但时区偏移量始终设置为 +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; }
4

4 回答 4

44

基本上,一旦您 [在您的 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));

  }
于 2013-05-28T15:44:26.757 回答
6
于 2016-10-13T20:59:24.030 回答
0

使用格式 val formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSSZZ")

于 2018-09-07T06:45:48.103 回答
0

尝试这个。

ISODateTimeFormat.dateTimeParser().parseDateTime(dateString), 

然后将其转换为您想要的格式。

于 2016-10-13T03:27:09.777 回答