![](/img/trans.png)
[英]LocalDateTime - deserialization with LocalDateTime.parse
[英]How to parse an ISO date with LocalDateTime.parse(...)
我想像这样解析像2011-11-30
这样的日期字符串:
LocalDateTime.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE)
但我得到以下异常:
java.time.format.DateTimeParseException: Text '2011-11-30' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor
如果我传递日期和时间字符串,一切都会按预期进行:
LocalDateTime.parse("2011-11-30T23:59:59", DateTimeFormatter.ISO_LOCAL_DATE_TIME)
如何将2011-11-30
之类的日期解析为 LocalDateTime(具有默认时间)?
正如@JB Nizet 所建议的,以下作品
LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDateTime localDateTime = localDate.atTime(23, 59, 59);
System.out.println(localDateTime); // 2011-11-30T23:59:59
如何将 2011-11-30 之类的日期解析为 LocalDateTime(具有默认时间)?
LocalDate
中解析它LocalDateTime
atTime()
方法设置默认时间注意:使用DateTimeFormatter.ISO_LOCAL_DATE
对于parse()
是多余的,请参阅API LocalDate#parse()
下面的示例使用了一些幻数,应该避免( 什么是幻数,为什么它不好? )。
而不是使用方法 atTime(hour, minute, second),
LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDateTime localDateTime = localDate.atTime(23, 59, 59);
您可以使用 LocalTime 常量,例如LocalTime.MAX 、(23:59:59)、 LocalTime.MIN (00:00:00)、 LocalTime.MIDNIGHT (23:59:59) 或LocalTime.NOON (12:00) :00)
LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.MIN);
它有利于可维护性和交叉引用。
不幸的是,所有现有答案都只是部分正确。 它们缺少现代日期时间 API 的以下重要方面:
LocalDateTime
的实例以获取具有当前时间的LocalDateTime
的新实例OP发布的问题:
如何将 2011-11-30 之类的日期解析为 LocalDateTime(具有默认时间)?
您的方法有两个问题:
由于您正在解析日期字符串,因此您应该使用LocalDate#parse
而不是LocalDateTime#parse
。
由于您的日期字符串已经在 ISO 模式中,因此您无需使用DateTimeFormatter
明确指定此模式,因为LocalDate.parse
默认使用此模式。
除了这两个问题之外,您还需要使用LocalDateTime#with
将当前时间应用于LocalDateTime
的实例,以获取具有当前时间的LocalDateTime
的新实例。
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; public class Main { public static void main(String[] args) { // No need to specify DateTimeFormatter as the string is already in ISO format LocalDate date = LocalDate.parse("2011-11-30"); System.out.println(date); // Get LocalDateTime from LocalDate LocalDateTime ldt = date.atStartOfDay() //Convert to LocalDateTime with 00:00.with(LocalTime.now()); //Adjust to current time System.out.println(ldt); } }
输出:
2011-11-30 2011-11-30T11:53:39.103150
注意:从Trail:Date Time了解有关现代日期时间 API 的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.