栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将Java日期转换为XML日期格式(反之亦然)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将Java日期转换为XML日期格式(反之亦然)

原始答案

我在这里猜测,“ 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)。但是,我将其留给读者进行测试并确认。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/487038.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号