当前位置: 首页 > 面试题库 >

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

向苗宣
2023-03-14
问题内容

是否存在将Java Date转换为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: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)。但是,我将其留给读者进行测试并确认。



 类似资料:
  • 问题内容: 我是php新手。我想编写一个函数,我需要用户以任何日期格式(包括DST)将日期输入到GMT格式,然后再返回到原始输入的格式。请任何机构帮助我。 问题答案: 尽管gmdate函数可用。如果您使用的是PHP 5.2或更高版本,请考虑使用DateTime对象。 这是切换到GMT的代码 然后返回默认时区… 使用DateTime对象可以像创建过程函数一样创建日期时间,只是保留对实例的引用。 例如

  • 问题内容: 我正在使用需要json日期格式的API。 我需要转换我的JavaScript日期 1970年1月17日星期六格林尼治标准时间+0100(浪漫标准时间) 以json日期格式 /日期(1405699200)/ 问题答案: 列各项可以吗?

  • 问题内容: 我有一个输出数据数组的PHP脚本。然后将其转换为使用函数。 我的问题是我的数组中有一个日期,但日期格式不正确。 我怎样才能在PHP中转换它呢? 代替上面的日期,我需要等效的JavaScript函数 新的Date() 当我输出上述内容时,我得到以下内容:“ Fri Jun 01 2012 11:08:48 GMT + 0100(GMT Daylight Time)”但是,如果我将PHP日

  • 我想创建一个“yyyy-mm-dd hh:mm:ss”格式的日期对象。下面是我正在使用的代码。解析字符串后形成的日期对象不是所需的格式(预期为:2020-04-04 00:00:00,但实际为:Sat Apr 04 00:00:00 CDT 2020)。如何将日期转换为所需格式

  • 问题内容: 我的json 响应 包含一个 CreatedOn 日期: 我需要将 CreatedOn 转换为简单的日期格式,并 计算从CreatedOn日期到当前日期的差异天数。 当我调试下面的代码字符串 CreatedOn时 显示一个空值。怎么会? 问题答案: 要么 考虑使用JSON方法而不是包含。JSON具有“ has()”,用于验证密钥是否存在。 您还应该确保首先尝试{}捕获{}字符串,以确保

  • 周日->明谷-0 周一->赛宁-1 周二->Selasa-2 帮我谢谢