我具有以下格式的XMLGregorianCalendar: 2019-06-24T18:18:55.007 + 02:00
我如何像这样在String中获取正确的日期(考虑了偏移量): 24/06/2019 16:18 ?
答案 0 :(得分:1)
您标记了问题java-6。但是我正在使用现代Java日期和时间API java.time提出现代答案。可通过ThreeTen Backport在Java 6中使用(请参见底部的链接)。
根据获取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.0_67和ThreeTen Backport版本1.3.6中进行了测试):
24/06/2019 16:18
假设格式是要显示给用户的,我建议使用Java的本地化格式。我选择了马耳他语区域设置,因为它与您要求的格式完全匹配。如果您的用户使用的是其他语言环境,则仍应考虑该语言环境的格式。
如果您的XMLGregorianCalendar
是从旧版API获得的,而您现在无法承担更改费用,那么有很多方法可以进行转换。
一种方法是从XMLGregorianCalendar
取回字符串:
XMLGregorianCalendar xmlgc = DatatypeFactory.newInstance()
.newXMLGregorianCalendar("2019-06-24T18:18:55.007+02:00");
String fromXml = xmlgc.toString();
现在剩下的如上。优点:很短,我认为其中没有任何惊喜。缺点:对我来说,格式化回原始字符串并再次解析就感觉像是绕路了。
另一种选择遍历了过时的GregorianCalendar
类:
GregorianCalendar gc = xmlgc.toGregorianCalendar();
ZonedDateTime zdt = DateTimeUtils.toZonedDateTime(gc);
String formattedUtcDateTime = zdt.toOffsetDateTime()
.withOffsetSameInstant(ZoneOffset.UTC)
.format(displayFormatter);
专业人士:我认为这是官方转换。缺点:比以前长了一行,而且正如我所说,它使用了设计欠佳且过时的GregorianCalendar
类。
java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 1 :(得分:0)
我找到的有效解决方案:
<div class="limiter">
<div class="InnerBox">
<div>
<h2>CLICK HERE</h2>
<p>Lorem, ipsum.</p>
</div>
</div>
<div class="OuterBox"></div>
</div>