将Java日期转换为XML日期格式(反之亦然)
是否存在将Java Date转换为XML日期字符串格式(反之亦然)的简便方法?
干杯,
安德兹
回答:
回答:
我在这里猜测,“ XML日期格式”是指“ 2010-11-04T19:14Z”。它实际上是ISO
8601格式。
您可以使用其他人建议的SimpleDateFormat,FastDateFormat或使用Joda
Time进行转换,我相信它是专门为此目的而创建的。
回答:
正如 在评论中指出的那样,可以通过示例改进此答案。
首先,我们必须弄清楚原始答案已经过时了。这是因为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:00
ZonedDateTime 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 conversion
ZonedDateTime 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)。但是,我将其留给读者进行测试并确认。
以上是 将Java日期转换为XML日期格式(反之亦然) 的全部内容, 来源链接: utcz.com/qa/414056.html