使用java.text.SimpleDateFormat解析日期字符串

bqf10yzr  于 2022-12-25  发布在  Java
关注(0)|答案(7)|浏览(117)

我遇到了一个奇怪的问题,我需要解析一个看起来像1997-02-14T00:00:00.0000000+05:30的日期字符串。日期字符串的奇怪之处在于时区信息。它是+05:30而不是通常的+0530
我已经准备好了基本的格式字符串,yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ,如果没有TZ信息,它会像一个魅力一样工作。
有谁能提出一个解决这个问题的方法吗?有没有某种格式字符串可以处理这种TZ信息?
先谢了。

mkh04yzy

mkh04yzy1#

几个月前我自己也研究过这个问题。如果我没记错的话,SimpleDateFormat不够灵活,无法接受其他时区格式(我的是+530)。我所做的是一个简单的预处理步骤-即在将String传递给SimpleDateFormat之前,尝试删除冒号。

lmyy7pcs

lmyy7pcs2#

你能不能不用正则表达式进行预处理并替换时区。

String dateAndTime = ...
String preprocessed = dateAndTime.replace("([+-])(\\d\\d):(\\d\\d)$", "$1$2$3");
// Go on with your life
bn31dyow

bn31dyow3#

Java 8 +

将 * 1997 - 02 - 14T00:00:00.0000000 + 05:30 * 表示为的最合适的类型是OffsetDateTime。请注意,java.time API基于ISO 8601,因此无需指定DateTimeFormatter来解析已经采用ISO 8601格式的日期时间字符串。

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;

class Main {
    public static void main(String[] args) {
        String strDateTime = "1997-02-14T00:00:00.0000000+05:30";
        OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
        System.out.println(odt);

        // Technically, you can also parse it into a ZonedDateTime but a ZonedDateTime
        // is supposed to contain ZoneId along with ZoneOffset
        System.out.println(ZonedDateTime.parse(strDateTime));

        // With Java 12+, it is also possible to parse it into an Instant
        System.out.println(Instant.parse(strDateTime));
    }
}
    • 输出**:
1997-02-14T00:00+05:30
1997-02-14T00:00+05:30
1997-02-13T18:30:00Z

从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

只是为了完整

java.util Date-Time API和它们的格式化API SimpleDateFormat已经过时并且容易出错。自从Java-8发布(2014年3月)以来,强烈建议完全停止使用它们并切换到modern Date-Time API。但是,无论出于何种原因,如果您想坚持使用旧版API,您可以使用SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX")来解析字符串。

class Main {
    public static void main(String[] args) throws ParseException {
        String strDateTime = "1997-02-14T00:00:00.0000000+05:30";
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX");
        Date date = sdf.parse(strDateTime);
        System.out.println(date);
    }
}
    • 输出**:
Thu Feb 13 18:30:00 GMT 1997
3pmvbmvn

3pmvbmvn4#

这是一个来自XML文件(ISO8601格式)的日期字符串吗?不幸的是,SimpleDateFormat没有(简单的)方法来解析它,这正是由于SimpleDateFormat无法正确处理时区部分中的':'。
看看我对另一个问题的回答,即如何解析XML日期时间字符串。

7gs2gvoe

7gs2gvoe5#

当然,总是存在预处理String的方法。
如果没有人找到更好的答案,那就说明问题已经解决了。你可以把它封装在一个方法中,并加上一个注解来解释这个黑客攻击。

zlwx9yxi

zlwx9yxi6#

SimpleDateFormat应接受此格式。来自文档:
对于解析,也接受常规时区。
具体如下:

GMTOffsetTimeZone:
             GMT Sign Hours : Minutes

看起来就像你的
如果失败了,那么Joda DateTimeFormat声称可以做到这一点。出于各种原因(更一致和更简单的API,格式化程序/解析程序的线程安全性等),我会忍不住使用Joda。

sg24os4d

sg24os4d7#

我认为它应该使用StringreplaceAll方法来处理regular expression

String dateAndTime = ...
String preprocessed = dateAndTime.replaceAll("(GMT)([+-])(\\d\\d):(\\d\\d)", "$2$3$4");

相关问题