我只是想在Java 8中将日期字符串转换为DateTime对象。运行以下行:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);
我收到以下错误:
Exception in thread "main" java.time.format.DateTimeParseException:
Text '20140218' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor:
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
语法与建议here的语法相同,但我遇到了异常。我正在使用JDK-8u25
。
答案 0 :(得分:129)
事实证明,Java不接受Date Date值作为DateTime。使用LocalDate而不是LocalDateTime解决了这个问题:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);
答案 1 :(得分:53)
如果您确实需要将日期转换为LocalDateTime对象,则可以使用LocalDate.atStartOfDay()。这将在指定日期为您提供LocalDateTime对象,将小时,分钟和秒字段设置为0:
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();
答案 2 :(得分:36)
如果有人应该再读一遍这个主题(比如我),那么正确的答案将是DateTimeFormatter
定义,例如:
private static DateTimeFormatter DATE_FORMAT =
new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
如果出现可选字段,则应设置它们。其余的代码应完全相同。
答案 3 :(得分:28)
这是一个非常不清楚且无用的错误消息。经过多次试验和错误,我发现如果您不尝试解析时间LocalDateTime
将会出现上述错误。通过使用LocalDate
代替,它可以正常运行。
这个记录很少,相关的例外情况非常无益。
答案 4 :(得分:18)
扩展retrography's answer ..:即使使用LocalDate
而非LocalDateTime
,我也遇到了同样的问题。问题是我使用DateTimeFormatter
创建了.withResolverStyle(ResolverStyle.STRICT);
,因此我不得不使用日期模式uuuuMMdd
而不是yyyyMMdd
(即“年”代替“年份” -era“)!
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseStrict()
.appendPattern("uuuuMMdd")
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);
(此解决方案最初是对回顾的答案的评论,但我鼓励将其作为一个独立的答案发布,因为它显然对许多人来说非常有效。)
答案 5 :(得分:13)
对于任何在此处遇到此错误的人,就像我一样:
Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}
它来自以下一行:
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));
事实证明,这是因为我在0小时内使用的是12小时模式,而不是24小时模式。
使用大写H将小时更改为24小时模式修复它:
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));
答案 6 :(得分:10)
如果日期字符串不包含小时,分钟等任何值,则无法将其直接转换为LocalDateTime
。您只能将其转换为LocalDate
,因为字符串仅 代表 年,月和日期组件,它将是正确的事情要做。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06
无论如何,您可以将其转换为LocalDateTime
。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00
答案 7 :(得分:1)
尝试这个:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy");
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);
您可以添加所需的任何格式。对我有用!
答案 8 :(得分:1)
这很好
public class DateDemo {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
String date = "16-08-2018 12:10";
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println("VALUE="+localDate);
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
LocalDateTime parse = LocalDateTime.parse(date, formatter1);
System.out.println("VALUE1="+parse);
}
}
输出:
VALUE=2018-08-16
VALUE1=2018-08-16T12:10
答案 9 :(得分:0)
我遇到这个问题是因为我的输入字符串中没有年份:
输入字符串:Tuesday, June 8 at 10:00 PM
格式化程序:DateTimeFormatter.ofPattern("EEEE, MMMM d 'at' h:mm a", Locale.US);
我知道年份,所以我只是附加它以获得:
输入字符串:Tuesday, June 8 at 6:30 PM 2021
格式化程序:DateTimeFormatter.ofPattern("EEEE, MMMM d 'at' h:mm a uuuu", Locale.US);