当前位置: 首页 > 知识库问答 >
问题:

如何使用DateFormatter将格式为yyyyMMddHHmmss的DateTime解析为OffsetDateTime

子车雅珺
2023-03-14

我有一个用于JSON解析的API,它需要一个DateTimeFormatter实例,以便将日期时间字符串解析为OffsetDateTime。但是,我总是遇到一个异常,无法从临时Accessor{}获取ZoneOffset,ISO解析为2021-08-17T13:26:49,类型为java。时间总体安排解析后的API使用OffsetDateTime。解析(字符串、日期格式化程序)。

// DateTimeFormatter instance to be provided to the API
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
// this is how the API uses the DateTimeFormatter instance
OffsetDateTime dateTime = OffsetDateTime.parse("20210817132649", formatter);

我必须如何创建DateTimeFormatter以交付ZoneOffset,以便API能够正确解析DateTime。区域偏移可以是UTC。

共有3个答案

锺离旻
2023-03-14

更好地使用ZonedDateTime-区别在于节省时间,以及具有相同区域偏移的国家。也许使用默认的ZoneId

翁翰墨
2023-03-14

嗯,您传入的字符串不包含区域信息,而OffsetDateTime需要区域信息。

因此,您必须为它设置一个值。

您可以使用DateTimeFormatterBuilder类,如果解析信息中缺少字段,则可以指示该类使用某些默认值:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
    .appendPattern("yyyyMMddHHmmss")
    .toFormatter(Locale.ROOT);

您还可以直接将隐含区域设置为DateTimeFor事

DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneOffset.UTC);
羊舌高明
2023-03-14

我从你那里了解到,你使用的API如下:

apiClient.getJSON().setOffsetDateTimeFormat(DateTimeFormatter); 

而且您没有传递时区信息的参数。在这种情况下,您可以使用DateTimeFormatter#with zone,如下所示:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss", Locale.ENGLISH)
                                        .withZone(ZoneOffset.UTC);

        OffsetDateTime odt = OffsetDateTime.parse("20210817132649", formatter);

        System.out.println(odt);
    }
}

输出:

2021-08-17T13:26:49Z

在线演示

即现在,您的电话将是:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss", Locale.ENGLISH)
                                .withZone(ZoneOffset.UTC);

apiClient.getJSON().setOffsetDateTimeFormat(formatter); 

日期时间字符串没有时区偏移。将其解析为LocalDateTime,然后对其应用偏移量。

演示:

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss", Locale.ENGLISH);
        
        OffsetDateTime odt = LocalDateTime.parse("20210817132649", formatter)
                                .atOffset(ZoneOffset.UTC);
        
        System.out.println(odt);
    }
}

输出:

2021-08-17T13:26:49Z

在线演示

输出中的Z是零时区偏移的时区指示符。它代表Zulu并指定Etc/UTC时区(其时区偏移量为00:00hours)。您可以根据需要指定不同的时区偏移量(例如(“05:30”))的时区偏移量。

如果您有ZoneId可用,您应该将给定的日期时间字符串解析为LocalDateTime,然后将ZoneId应用到它以获得ZonedDateTime,从中您可以始终获得OffsetDateTime.关于ZonedDateTime最好的一点是,它被设计为自动调整时区偏移,而OffsetDateTime用于表示固定的时区偏移。

演示:

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss", Locale.ENGLISH);

        ZonedDateTime zdt = LocalDateTime.parse("20210817132649", formatter)
                                .atZone(ZoneId.of("Etc/UTC"));

        OffsetDateTime odt = zdt.toOffsetDateTime();

        System.out.println(odt);
    }
}

输出:

2021-08-17T13:26:49Z

在线演示

您可以根据需要指定不同的ZoneId(例如ZoneId.of("Asia/Kolkata"))。

从Trail:Date-Time了解有关现代日期时间API的更多信息。

*如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请通过desugaring检查Java 8 API。请注意,Android8.0Oreo已经提供了对java的支持。时间

 类似资料:
  • 我有一个包含格式为yyyyMMddHHmmss(例如)(20180626170555)的日期的字符串,我正在使用以下代码将其转换为日期时间 例外情况是: 原因何在?

  • 问题内容: 我正在尝试使用这种格式来格式化当前时间。 输出: 有什么建议? 问题答案: 用 由于Go使用以下常量来格式化日期,请参阅此处

  • 问题内容: 我有一个带有日期类型的列。 我从外部应用程序获取日期/时间的字符串值。该字符串值如下所示: MySQL在INSERT上引发错误:。我的解决方法是将列类型更改为,但可以,但是我确实需要数据作为适当的日期和时间以备将来使用。 我研究了值的可接受格式,发现想要的格式为。 我无法更改外部应用程序以将日期/时间字符串重新格式化为格式,所以我唯一的机会就是处理它。 我想我需要做的是在我的语句中使用

  • 我如何能使这工作? 它会给出以下错误: "无效的日期格式31.01.2020 00:00:00"

  • 问题内容: 编辑:我已经编辑了我的问题,以包括更多信息,我已经尝试了许多方法来执行此操作,在StackOverflow上提问通常是我的最后选择。任何帮助是极大的赞赏。 我有一个日期(它是一个时间戳记对象),格式为YYYYMMDDHHMMSS(例如20140430193247)。它从我的服务发送到前端,并使用AngularJS以以下格式显示:date:’dd / MM / yyyy’。 如何将其转换

  • 到目前为止我没有问题。我可以解析html数据。我使用jsoup中的select方法,并使用“div.col-section”检索数据,这意味着我要查找类为col-section的div元素。我想用文本区打印数据。结果,我有一个巨大的一个段落,即使在网站上的真实数据是不止一个段落。那么如何像网站上一样解析数据呢?