我有一个用于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。
更好地使用ZonedDateTime
-区别在于节省时间,以及具有相同区域偏移的国家。也许使用默认的ZoneId
。
嗯,您传入的字符串不包含区域信息,而OffsetDateTime
需要区域信息。
因此,您必须为它设置一个值。
您可以使用DateTimeFormatterBuilder
类,如果解析信息中缺少字段,则可以指示该类使用某些默认值:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
.appendPattern("yyyyMMddHHmmss")
.toFormatter(Locale.ROOT);
您还可以直接将隐含区域设置为DateTimeFor事
:
DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneOffset.UTC);
我从你那里了解到,你使用的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:00
hours)。您可以根据需要指定不同的时区偏移量(例如(“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元素。我想用文本区打印数据。结果,我有一个巨大的一个段落,即使在网站上的真实数据是不止一个段落。那么如何像网站上一样解析数据呢?