在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
,因为该类表示一个时间跨度,其粒度为年、月、日。但是,持续时间
是总秒数加上几分之一秒(纳秒)的时间跨度。因此,持续时间
适用于日期时间值,如即时
、偏移日期时间
、和分区日期时间
,而不是仅适用于日期的本地日期
。