Date 如何从XmlGregorianCalendar获取考虑了偏移量的日期?
我有一个XMLGregorianCalendar,格式如下:2019-06-24T18:18:55.007+02:00Date 如何从XmlGregorianCalendar获取考虑了偏移量的日期?,date,java-6,xmlgregoriancalendar,Date,Java 6,Xmlgregoriancalendar,我有一个XMLGregorianCalendar,格式如下:2019-06-24T18:18:55.007+02:00 如何在字符串中获得正确的日期(考虑偏移量):2019年6月24日16:18?您将问题标记为java-6。然而,我使用java.time(现代java日期和时间API)给出了现代答案。这在Java6中通过ThreeTen Backport提供(请参见底部的链接) 根据您的XMLGregorianCalendar来源,您可能不需要一个。如果我理解正确的话,这个类用于在XML文档中表
如何在字符串中获得正确的日期(考虑偏移量):2019年6月24日16:18?您将问题标记为java-6。然而,我使用java.time(现代java日期和时间API)给出了现代答案。这在Java6中通过ThreeTen Backport提供(请参见底部的链接) 根据您的
XMLGregorianCalendar
来源,您可能不需要一个。如果我理解正确的话,这个类用于在XML文档中表示日期和时间,它们的格式如2019-06-24T18:18:55.007+02:00
。此格式与ISO 8601非常接近,因此java.time类可以直接解析它,我们更喜欢:
Locale userLocale = Locale.forLanguageTag("mt-MT"); // Maltese Malta
DateTimeFormatter displayFormatter
= DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
.withLocale(userLocale);
String fromXml = "2019-06-24T18:18:55.007+02:00";
OffsetDateTime dateTime = OffsetDateTime.parse(fromXml);
String formattedUtcDateTime = dateTime.withOffsetSameInstant(ZoneOffset.UTC)
.format(displayFormatter);
System.out.println(formattedUtcDateTime);
此代码段的输出是(在Java 1.7.067和Threen Backport版本1.3.6中测试):
2019年6月24日16:18
假设格式化是为了向用户显示,我建议使用Java的本地化格式。我选择了马耳他语言环境,因为它与您要求的格式完全匹配。如果您的用户位于不同的区域,您仍然应该考虑该区域的格式。
从XMLGregorianCalendar转换
如果您的XMLGregorianCalendar
是从一个您现在无法更改的遗留API获得的,那么有许多转换它的选项
一种是从XMLGregorianCalendar
获取字符串:
XMLGregorianCalendar xmlgc = DatatypeFactory.newInstance()
.newXMLGregorianCalendar("2019-06-24T18:18:55.007+02:00");
String fromXml = xmlgc.toString();
现在,其余部分如上所述。赞成者:它很短,我不认为有什么意外。缺点:对我来说,重新格式化为原始字符串并再次解析它就像是绕道而行
另一个选项是过时的gregorianalendar
类:
GregorianCalendar gc = xmlgc.toGregorianCalendar();
ZonedDateTime zdt = DateTimeUtils.toZonedDateTime(gc);
String formattedUtcDateTime = zdt.toOffsetDateTime()
.withOffsetSameInstant(ZoneOffset.UTC)
.format(displayFormatter);
赞成者:我认为这是官方的转换。缺点:这是一行较长的代码,正如我所说,它使用了设计拙劣且过时的gregorianalendar
类
链接
- 解释如何使用java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻
private String getFormattedDate(final XMLGregorianCalendar xmlGregorianCalendar) {
Date time = xmlGregorianCalendar.toGregorianCalendar().getTime();
Date rightDate = DateUtils.addMinutes(time, - xmlGregorianCalendar.getTimezone());
String formatedDate = DateHelper.format(DateHelper.YYYYMMDDHHMMSS_DASH_COLONS, rightDate);
return formatedDate;}
这可能是一个复制品吗?还是之前的其他问题?您搜索得有多彻底?您希望时间始终以UTC为单位,还是以用户的时区为单位?对于您的答案,先生,但它与Java 6解决方案不对应,我实现的解决方案是从xmlGregorianCalendar获取日期对象:
Date-Date=xmlGregorianCalendar.toGregorianCalendar().getTime()
然后使用getTimeZone方法:int minutesOffset=xmlGregorianCalendar.getTimeZone()
(结果为120分钟),然后dateWantedDate=Date.addMinutes(xmlGregorianCalendar.getTimeZone())
最终格式化以获得2019年6月24日16:18
。我不知道您使用的是哪种addMinutes
方法?如果您从下载ThreeTen Backport并将JAR文件添加到您的项目中,我的答案和代码将在Java6上运行。是这样吗?如果是这样的话:(1)这是不正确的/误用的,肯定会引起混淆。(2) Joda Time项目处于维护模式,不建议用于新代码。任何时候我都喜欢三点十分的后场。(3) 如果您坚持使用Joda Time,我相信可以找到更好的Joda Time解决方案。