Java解析带有时区的日期字符串

8
我想从格式为"31-12-2014 18:09 +05:30"的字符串中解析带有时区的日期。我尝试使用"d-MM-yyyy HH:mm ZZ""d-MM-yyyy HH:mm Z"进行简单日期格式解析,但是它给出了一个无法解析的日期异常。如何解决这个问题? 请帮助我。

请参见以下链接:http://stackoverflow.com/questions/6705213/parsing-a-string-with-a-gmt-timezone-to-date-using-simpledateformat - Hacketo
请转到以下链接以了解如何将字符串转换为日期:http://www.mkyong.com/java/how-to-convert-string-to-date-java/ - Himanshu
尝试使用 dd-MM-yyyy HH:mm Zdd-MM-yyyy HH:mm X,为什么要使用 d 而不是 dd - Abhishek
5个回答

10
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm XXX");
Date d = sdf.parse("31-12-2014 18:09 +05:30");
System.out.println(d);

请注意,在 JDK7 的 SimpleDateFormat 中,不能使用X,因为它是 ISO 8601 时区格式。

在 Java 6 中,您只能使用ZZZ,但它不会匹配 +05:30,因为Z匹配 RFC 822 时区格式。

如果您正在使用 Java 6,请参考此回答:将符合 ISO 8601 标准的字符串转换为 java.util.Date


如何解析“Wed May 23 16:52:42 EDT 2018”日期?当我将简单日期格式设置为“ddd MMM dd HH:mm:ss XXX yyyy”时,它会出现“java.text.ParseException:无法解析的日期:”Wed May 23 16:52:42 EDT 2018“”错误,而当我尝试使用“ddd MMM dd HH:mm:ss EDT yyyy”时,它会显示非法字符T,这是没有意义的。 - Aalap Patel
@AalapPatel 请阅读我在答案中提到的文档中的日期和时间模式,以了解它是如何工作的。如果您仍然有问题,可以在StackOverflow上询问特定问题,如果还没有一个已经给出了答案。 - alain.janinm

3

使用X代替如下的Z或ZZ:

String str = "31-12-2014 18:09 +05:30";
DateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm X");
System.out.println(format.parse(str));
Output:
Wed Dec 31 18:39:00 IST 2014

如何解析“Wed May 23 16:52:42 EDT 2018”日期?当我将简单日期格式设置为“ddd MMM dd HH:mm:ss XXX yyyy”时,它会出现“java.text.ParseException:Unparseable date:“Wed May 23 16:52:42 EDT 2018””错误,而当我尝试“ddd MMM dd HH:mm:ss EDT yyyy”时,它会显示非法字符T,这是没有意义的。那么识别格式中的EDT的正确方法是什么?提前致谢... - Aalap Patel

2

对于任何偶然发现这些帖子的人:

如果您使用的是Java 8或更高版本,则应该使用java.time...

以下是如何解析问题中的示例String

public static void main(String[] args) {
    // example String
    String datetimeString = "31-12-2014 18:09 +05:30";
    // formatter for that very pattern
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern(
                                "dd-MM-uuuu HH:mm xxx", Locale.ENGLISH
                            );
    // use the formatter to get an OffsetDateTime
    OffsetDateTime odt = OffsetDateTime.parse(datetimeString, dtf);
    // print the result
    System.out.println(odt);
    // or print the result using the input format
    System.out.println(odt.format(dtf));
}

输出:

2014-12-31T18:09+05:30
31-12-2014 18:09 +05:30

1

只有当您始终使用两个数字(例如“01”)时,才必须使用两个“d”。 - meskobalazs

1

有些人指出了Java SE 7中的X选项。然而,如果您使用较旧的Java版本,则可以将时区部分更改为+0530,然后它将与Z一起使用(即使在Java SE 1.4中也可用)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接