如何使用 LocalDateTime.parse(...) 解析 ISO 日期
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
How can I parse a date like 2011-11-30 to a LocalDateTime (with a default time)?
- 先在
LocalDate
中解析
- 使用
LocalDateTime
atTime()
方法设置默认时间
注意:使用 DateTimeFormatter.ISO_LOCAL_DATE
对于 parse()
是多余的,请参阅 API LocalDate#parse()
下面的示例使用了一些幻数,应该避免 (What is a magic number, and why is it bad?)。
而不是使用方法 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) or LocalTime.NOON (12:00:00)
LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.MIN);
更好的可维护性和交叉引用。
为什么我在已有答案的情况下写了这个答案
不幸的是,所有现有答案都只是部分正确。他们缺乏现代 date-time API 的以下重要方面:
- 解析日期字符串时使用 ISO 格式
- 如何将当前时间应用于
LocalDateTime
的实例以获取具有当前时间 的 LocalDateTime
的新实例
OP 发布的问题:
How can I parse a date like 2011-11-30 to a LocalDateTime (with a
default time)?
回答
你的方法有两个问题:
由于您正在解析日期字符串,因此您应该使用 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 了解更多关于现代 date-time API 的信息。 =24=]
我想像这样解析 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
How can I parse a date like 2011-11-30 to a LocalDateTime (with a default time)?
- 先在
LocalDate
中解析
- 使用
LocalDateTime
atTime()
方法设置默认时间
注意:使用 DateTimeFormatter.ISO_LOCAL_DATE
对于 parse()
是多余的,请参阅 API LocalDate#parse()
下面的示例使用了一些幻数,应该避免 (What is a magic number, and why is it bad?)。
而不是使用方法 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) or LocalTime.NOON (12:00:00)
LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.MIN);
更好的可维护性和交叉引用。
为什么我在已有答案的情况下写了这个答案
不幸的是,所有现有答案都只是部分正确。他们缺乏现代 date-time API 的以下重要方面:
- 解析日期字符串时使用 ISO 格式
- 如何将当前时间应用于
LocalDateTime
的实例以获取具有当前时间 的
LocalDateTime
的新实例
OP 发布的问题:
How can I parse a date like 2011-11-30 to a LocalDateTime (with a default time)?
回答
你的方法有两个问题:
由于您正在解析日期字符串,因此您应该使用
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 了解更多关于现代 date-time API 的信息。 =24=]