在Java中将字符串转换为OffsetDateTime

在Java中将字符串转换为OffsetDateTime,java,string,date,datetime,java-8,Java,String,Date,Datetime,Java 8,我试图转换OffsetDateTime中的字符串,但出现以下错误 java.time.format.DateTimeParseException:无法分析文本“20150101”:无法从TemporalAccessor获取OffsetDateTime:{},ISO已解析为java.time.format.parsed类型的2015-01-01 代码:OffsetDateTime.parse(“20150101”,模式的DateTimeFormatter.of(“yyyyMMdd”) 预期输出:O

我试图转换
OffsetDateTime
中的字符串,但出现以下错误

java.time.format.DateTimeParseException:无法分析文本“20150101”:无法从TemporalAccessor获取OffsetDateTime:{},ISO已解析为java.time.format.parsed类型的2015-01-01

代码:OffsetDateTime.parse(“20150101”,模式的DateTimeFormatter.of(“yyyyMMdd”)

预期输出:
OffsetDateTime对象,日期为20150101。

我真的很感激你能提供的任何帮助


谢谢,

在您的案例中使用LocalDate而不是offsetDatetime,因为您只想解析日期(无时间/偏移)。offsetDatetime的用法已经得到了很好的讨论

offsetDatetime
表示带有偏移量的日期时间,例如

2007-12-03T10:15:30+01:00

您试图分析的文本不符合
OffsetDateTime的要求。

正在分析的字符串既不包含区域偏移量,也不包含时间。从字符串和格式化程序的模式来看,您似乎只需要一个LocalDate。因此,您可以使用:

LocalDate.parse("20150101", DateTimeFormatter.ofPattern("yyyyMMdd"));

谢谢大家的回复。 早些时候,我使用JodaDateTime(查看下面的方法)来处理date和datetime,但我想使用Java8库而不是外部库

static public DateTime convertStringInDateFormat(String date, String dateFormat){
    DateTimeFormatter formatter = DateTimeFormat.forPattern(dateFormat);
return formatter.parseDateTime(date);
}
我希望OffsetDateTime也一样,但我知道如果我们想在某个时区处理日期/时间,我们可以使用ZonedDateTime或OffsetDateTime。 因为我正在研究LocalDate可以提供帮助的期间和持续时间

到日期时间的字符串:

LocalDate date =
LocalDate.parse("20150101", DateTimeFormatter.ofPattern("yyyyMMdd"));
将LocalDate转换为所需的字符串格式:

String dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'";
date.atStartOfDay().format(DateTimeFormatter.ofPattern(dateFormat));

字符串日期的格式与模式不同。您是否应该使用“yyyyMMdd”格式?很抱歉输入错误,更新了我的问题。我只传递了“yyyyMMdd”,但提到了错误。我认为您的日期和格式化程序也必须指定偏移量,如以下日期:2007-12-03T10:15:30+01:00。请参阅+号后面的部分。然后您可以使用例如
atStartOfDay().atOffset(您的DesiredOffset)
将其转换为
OffsetDateTime
。例如,偏移量可以是
ZoneOffset.UTC
。date和time类经常强迫你明确你想要什么,而不是给你可能不符合你需要的默认值,这是一件好事。正确的理解。提示:在最后一行,我建议始终在startofDay
调用时向该
传递一个显式的
ZoneId
。示例:
.atStartOfDay(ZoneId.of(“Africa/Lagos”))
否则您将隐式获取JVM的当前默认时区。最好明确你想要/期望的时区。而且,JVM中的任何代码都可以在运行时随时更改默认值,因此默认值是不可靠的。例如,根据您在问题中所说的,您将得到芝加哥一天的开始,而不是拉各斯一天的开始。另一个注释,
LocalDate
用于
Period
,因为该类表示一个时间跨度,其粒度为年、月、日。但是,
持续时间
是总秒数加上几分之一秒(纳秒)的时间跨度。因此,
持续时间
适用于日期时间值,如
即时
偏移日期时间
、和
分区日期时间
,而不是仅适用于日期的
本地日期