将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

回到顶部