Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何从XmlGregorianCalendar获取考虑了偏移量的日期?_Date_Java 6_Xmlgregoriancalendar - Fatal编程技术网

Date 如何从XmlGregorianCalendar获取考虑了偏移量的日期?

Date 如何从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文档中表

我有一个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-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解决方案。