13

我有如下解析日期的代码:

String ALT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
SimpleDateFormat sdf = new SimpleDateFormat(
                    ALT_DATE_TIME_FORMAT);
Date date = sdf.parse(requiredTimeStamp);

它工作正常,突然间,这停止了工作。事实证明,管理员在服务器上进行了一些配置更改,并且日期当前返回为“2010-12-27T10:50:44.000-08:00”,上述模式无法解析。我有两个问题:

第一个是什么模式会解析 JVM 以上述格式返回的日期(具体来说,只是 '-08:00' 作为时区)?其次,究竟应该在哪里更改 linux RHEL 5 服务器上的此类设置,以便我们在未来了解此类更改?

4

9 回答 9

27
于 2016-09-05T21:27:14.843 回答
4

另一个应用程序使用 ISO 8601 dateTime 格式。我假设另一个应用程序正在向您发送一个符合 XML Schema 的 dateTime 类型(即 ISO 8601)的 XML 响应。现在,众所周知,DateFormat 无法解析这种格式。您要么必须使用其他库,例如 joda-time(joda-time 是赢家),要么必须使用其他响应中指定的 FastDateFormat。查看这篇文章将符合 ISO 8601 的字符串转换为 java.util.Date

于 2010-12-28T01:01:54.463 回答
2

如果仍在寻找答案,这对我有用

我的输入:2020-12-08T10:36:53.939+05:30
我的输出:2020 年 12 月 8 日星期二 10:36:53 IST

您可以将此日期转换为您需要的任何格式!

private static Date convertDate(String input) {
    Date newDate = null;
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
        newDate=dateFormat.parse(input);  
    } catch (Exception e) {
        e.printStackTrace();
    }
    return newDate;
}
于 2020-12-08T12:50:10.130 回答
1

如果您想使用直接的 JDK 解析它,我相信它应该可以使用 JAXB 工具进行解析,请参阅DatatypeFactory.newXMLGregorianCalendarDatatypeConverter.parseDateTime

于 2010-12-28T01:04:34.947 回答
1

使用乔达时间

作为@Pangea 建议使用 JodaTime 的更具体示例,您可以使用以下内容:

String timestamp = "2012-09-17T04:11:46Z";

DateTime date = ISODateTimeFormat.dateTimeParser().parseDateTime(timestamp);

这可以正确识别 UTC 时区。我还没有在字符串时间戳中尝试过毫秒,但我相信它也能正常工作。

希望对其他人有所帮助。

J.P

于 2013-12-10T01:17:55.213 回答
0

问题应该requiredTimeStamp是来自何处以及以何种格式。它是由用户输入的,还是从另一个程序中读取的?哪个组件在字符串表示中创建日期?

格式“2010-12-27T10:50:44.000-08:00”看起来像标准化格式ISO-8601 它应该可以用模式解析yyyy-MM-dd'T'HH:mm:ss.SSSZ

不确定哪些设置会影响这一点,但有一个关于 Java TimeZones 的 Oracle 常见问题解答。它可能是user.timezone系统属性或/etc/localtimeRHEL 中的符号链接。

于 2010-12-28T00:09:20.690 回答
0

尝试将其更改为小写 z。

z 处理大多数常见的通用时区语法,而 Z 使用更严格的 4 位 RFC 822 时区。

尽管它记录了两者都应该解析“通用时区设置”,但它可能会对您的情况产生影响。

于 2010-12-28T00:51:16.783 回答
0

SimpleDateFormat 仅接受-0800GMT-08:00作为时区。

看来 ISO 8601 格式无法解析SimpleDateFormat。也许您应该看看Apache Commons LangFastDateFormat。它兼容SimpleDateFormat但接受ZZ应该解析您需要的时区格式的时区模式。DateFormatUtils包含一些看起来像您需要的模式的示例常量,只是没有毫秒(例如ISO_DATETIME_TIME_ZONE_FORMAT)。

于 2010-12-28T00:53:44.447 回答
0

两种解决方案:

  • OffsetDateTime(Java 8 内置)
  • joda(所有强大的日期 - 第 3 方图书馆)

OffsetDateTime 在这里显然是一个更好的选择,但如果 joda 从现在开始已经被证明非常强大,并且如果有人更喜欢使用它,那么下面的代码有两者的示例

两种方法的代码示例如下:

public class Demo {
public static void jodaTimeStuff(String dateString, DateTimeZone dtz) {
    System.out.println(StringUtils.leftPad(dateString, 29, " ") + "\t------->\t" + ISODateTimeFormat.dateTime().parseDateTime(dateString).toDateTime(dtz));
    System.out.println(StringUtils.leftPad(dateString, 29, " ") + "\t------->\t" + OffsetDateTime.parse(dateString).toZonedDateTime());
}
public static void main(String[] args) throws Exception {
    jodaTimeStuff("2010-03-01T08:00:00.000Z", DateTimeZone.UTC);
    jodaTimeStuff("2010-03-01T08:00:00.000Z", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
    jodaTimeStuff("2010-03-01T00:00:00.000-08:00", DateTimeZone.UTC);
    jodaTimeStuff("2010-03-01T00:00:00.000-08:00", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
    jodaTimeStuff("2010-03-01T00:00:00.000+05:30", DateTimeZone.UTC);
    jodaTimeStuff("2010-03-01T00:00:00.000+05:30", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
    jodaTimeStuff("2021-11-15T02:27:24.540288Z", DateTimeZone.UTC);
    jodaTimeStuff("2021-11-15T02:27:24.540288Z", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
}

}

输出:

     2010-03-01T08:00:00.000Z   ------->    2010-03-01T08:00:00.000Z
     2010-03-01T08:00:00.000Z   ------->    2010-03-01T08:00Z
     2010-03-01T08:00:00.000Z   ------->    2010-03-01T13:30:00.000+05:30
     2010-03-01T08:00:00.000Z   ------->    2010-03-01T08:00Z
2010-03-01T00:00:00.000-08:00   ------->    2010-03-01T08:00:00.000Z
2010-03-01T00:00:00.000-08:00   ------->    2010-03-01T00:00-08:00
2010-03-01T00:00:00.000-08:00   ------->    2010-03-01T13:30:00.000+05:30
2010-03-01T00:00:00.000-08:00   ------->    2010-03-01T00:00-08:00
2010-03-01T00:00:00.000+05:30   ------->    2010-02-28T18:30:00.000Z
2010-03-01T00:00:00.000+05:30   ------->    2010-03-01T00:00+05:30
2010-03-01T00:00:00.000+05:30   ------->    2010-03-01T00:00:00.000+05:30
2010-03-01T00:00:00.000+05:30   ------->    2010-03-01T00:00+05:30
  2021-11-15T02:27:24.540288Z   ------->    2021-11-15T02:27:24.540Z
  2021-11-15T02:27:24.540288Z   ------->    2021-11-15T02:27:24.540288Z
  2021-11-15T02:27:24.540288Z   ------->    2021-11-15T07:57:24.540+05:30
  2021-11-15T02:27:24.540288Z   ------->    2021-11-15T02:27:24.540288Z

示例代码中使用的一些依赖项(一个仅用于格式化,另一个用于 joda:

    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10.13</version>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.8</version>
    </dependency>

Dua me yaad rakhna(请在祈祷中记住我)

于 2021-12-18T05:38:11.390 回答