原始答案
我在这里猜测,“ XML日期格式”是指“ 2010-11-04T19:14Z”。它实际上是ISO
8601格式。
您可以使用其他人建议的SimpleDateFormat,FastDateFormat或使用Joda
Time进行转换,我相信它是专门为此目的而创建的。
编辑:代码样本等
正如 Earshae 在评论中指出的那样,可以通过示例改进此答案。
首先,我们必须弄清楚原始答案已经过时了。这是因为Java 8引入了用于操纵日期和时间的类-
java.time程序包应该引起人们的兴趣。如果您有幸使用Java 8,则应使用其中之一。但是,这些事情出奇地难以解决。
不是的LocalDate(Time)
考虑以下示例:
LocalDateTime dateTime = LocalDateTime.parse("2016-03-23T18:21");System.out.println(dateTime); // 2016-03-23T18:21乍一看,我们在这里使用的似乎是本地的(相对于用户的日期和时间)。但是,如果您敢问,您将得到不同的结果:
System.out.println(dateTime.getChronology()); // ISO
这实际上是ISO时间。我相信它应该显示为“ UTC”,但是这没有本地时区的概念。因此,我们应该认为它是通用的。
请注意,我们正在解析的字符串的末尾没有“
Z”。如果您添加除日期和时间之外的任何内容,将会受到欢迎
java.time.format.DateTimeParseException。因此,如果我们想解析ISO8601字符串,则该类似乎毫无用处。
ZonedDateTime进行救援
幸运的是,有一个类可以解析ISO8601字符串-
它是一个java.time.ZonedDateTime。
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2016-03-23T18:21+01:00");System.out.println(zonedDateTime); // 2016-03-23T18:21+01:00ZonedDateTime zonedDateTimeZulu = ZonedDateTime.parse("2016-03-23T18:21Z");System.out.println(zonedDateTimeZulu); // 2016-03-23T18:21Z唯一的问题是,您实际上需要使用时区指定。尝试解析原始日期时间(即“
2016-03-23T18:21”)将导致已经提及
RuntimeException。根据情况,您必须在
LocalDateTime和之间进行选择
ZonedDateTime。
当然,您可以轻松地在这两者之间进行转换,所以这应该不是问题:
System.out.println(zonedDateTimeZulu.toLocalDateTime()); // 2016-03-23T18:21// Zone conversionZonedDateTime cetDateTime = zonedDateTimeZulu.toLocalDateTime() .atZone(ZoneId.of("CET"));System.out.println(cetDateTime); // 2016-03-23T18:21+01:00[CET]我建议现在使用此类。但是,如果您的工作描述包括考古学(意味着您没有足够幸运地使用超过2年的Java 8 …),则可能需要使用其他工具。
SimpleDateFormat的喜悦
我不是https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html的忠实拥护者,但有时您别无选择。问题是,它不是线程安全的,如果不喜欢它,它将在您的脸上抛出一个选中的
Exception(即
ParseException)。因此,代码段相当难看:
private Object lock = new Object();// ...try { synchronized (lock) { // Either "2016-03-23T18:21+01:00" or "2016-03-23T18:21Z" // will be correctly parsed (mind the different meaning though) Date date = dateFormat.parse("2016-03-23T18:21Z"); System.out.println(date); // Wed Mar 23 19:21:00 CET 2016 }} catch (ParseException e) { LOG.error("Date time parsing exception", e);}FastDateFormat
FastDateFormat已同步,因此您至少可以摆脱同步块。但是,这是一个外部依赖性。但是由于它是Apache Commons
Lang且已被彻底使用,所以我认为它是可以接受的。实际上,它的用法与
SimpleDateFormat:
FastDateFormat fastDateFormat = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mmX");try { Date fastDate = fastDateFormat.parse("2016-03-23T18:21+01:00"); System.out.println(fastDate);} catch (ParseException e) { LOG.error("Date time parsing exception", e);}乔达时间
使用Joda-Time,您可能会认为以下工作有效:
DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser(); LocalDateTime dateTime = LocalDateTime.parse("2016-03-23T20:48+01:00", parser);System.out.println(dateTime); // 2016-03-23T20:48:00.000不幸的是,无论您放置在最后位置(Z,+ 03:00等)如何,结果都是一样的。显然,它不起作用。
好吧,您确实应该直接对其进行解析:
DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser();DateTime dateTime = parser.parseDateTime("2016-03-23T21:12:23+04:00");System.out.println(dateTime); // 2016-03-23T18:12:23.000+01:00现在可以了。请注意,与其他答案之一不同,我使用
dateTimeParser()而 不是
dateTime()。我注意到它们之间的行为存在细微但重要的区别(Joda-Time 2.9.2)。但是,我将其留给读者进行测试并确认。



