2015-10-06 134 views
3

我想解析'2015-10-01'与LocalDateTime。我要做的就是Lenient Java 8日期解析

LocalDate localDate = LocalDate.parse('2015-10-01'); 
LocalDateTime localDateTime = localDateTime.of(localDate, LocalTime.MIN); 

但我想解析它在一个传似

// throws DateTimeParseException 
LocalDateTime date = LocalDateTime.parse('2015-10-01', DateTimeFormatter.ISO_LOCAL_DATE); 

也是一个字符串的小的差异引发异常也是如此。

// throws DateTimeParseException 
LocalDate localDate = LocalDate.parse("2015-9-5", DateTimeFormatter.ISO_LOCAL_DATE); 

我可以用Java 8 Date APIs轻松解析日期字符串吗?

回答

6

如果你想解析日期字符串作为"2015-10-01""2015-9-5"LocalDateTime对象,你可以建立自己DateTimeFormatter使用DateTimeFormatterBuilder

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
             .appendPattern("yyyy") 
             .appendLiteral('-') 
             .appendValue(MONTH_OF_YEAR) 
             .appendLiteral('-') 
             .appendValue(DAY_OF_MONTH) 
             .parseDefaulting(HOUR_OF_DAY, HOUR_OF_DAY.range().getMinimum()) 
             .parseDefaulting(MINUTE_OF_HOUR, MINUTE_OF_HOUR.range().getMinimum()) 
             .parseDefaulting(SECOND_OF_MINUTE, SECOND_OF_MINUTE.range().getMinimum()) 
             .parseDefaulting(NANO_OF_SECOND, NANO_OF_SECOND.range().getMinimum()) 
             .toFormatter(); 
System.out.println(LocalDateTime.parse("2015-9-5", formatter)); 
System.out.println(LocalDateTime.parse("2015-10-01", formatter)); 

每个字段的可变长度由调用appendValue(field)处理。引用Javadoc:

像这样的可变宽度值的解析器通常表现得很贪婪,需要一位数字,但接受尽可能多的数字。

这意味着它将能够解析用1或2位数字格式化的月份和日期。

要构建一个LocalDateTime,我们还需要为此构建器提供一个LocalTime。这是通过对LocalTime的每个字段使用parseDefaulting(field, value)来完成的。如果该字段不存在于要解析的字符串中,则此方法为该字段提供一个字段和一个默认值。由于在我们的情况下,时间信息不会出现在字符串中,因此将选择默认值,即该字段的有效值范围的最小值(通过调用getMinimum来获得该字段的ValueRange ;也许我们也可以在这里硬编码0)。


在事件解析可能包含时间信息的字符串,我们可以使用的DateTimeFormatter可选部分,像这样:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
             .appendPattern("yyyy") 
             .appendLiteral('-') 
             .appendValue(MONTH_OF_YEAR) 
             .appendLiteral('-') 
             .appendValue(DAY_OF_MONTH) 
             .appendPattern("[ HH:mm]") // optional sections are surrounded by [] 
             .parseDefaulting(HOUR_OF_DAY, HOUR_OF_DAY.range().getMinimum()) 
             .parseDefaulting(MINUTE_OF_HOUR, MINUTE_OF_HOUR.range().getMinimum()) 
             .parseDefaulting(SECOND_OF_MINUTE, SECOND_OF_MINUTE.range().getMinimum()) 
             .parseDefaulting(NANO_OF_SECOND, NANO_OF_SECOND.range().getMinimum()) 
             .toFormatter(); 
System.out.println(LocalDateTime.parse("2015-9-5", formatter)); 
System.out.println(LocalDateTime.parse("2015-10-01", formatter)); 
System.out.println(LocalDateTime.parse("2015-1-1 10:10", formatter)); 
0

解析日期和时间

要创建您可以使用静态LocalDateTime.parse()方法的字符串LocalDateTime对象。它需要一个字符串和一个DateTimeFormatter作为参数。 DateTimeFormatter用于指定日期/时间模式。

String str = "1986-04-08 12:00"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
LocalDateTime dateTime = LocalDateTime.parse(str, formatter); 

格式化日期和时间

要创建一个格式化字符串了LocalDateTime对象,你可以使用format()方法。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
LocalDateTime dateTime = LocalDateTime.of(1986, Month.APRIL, 8, 12, 30); 
String formattedDateTime = dateTime.format(formatter); // "1986-04-08 12:30" 

注意,有预先定义为在DateTimeFormatter常量一些常用的日期/时间格式。例如:使用DateTimeFormatter.ISO_DATE_TIME来格式化上面的LocalDateTime实例会导致字符串“1986-04-08T12:30:00”。

parse()和format()方法可用于所有日期/时间相关的对象(例如LOCALDATE的或ZonedDateTime)

+0

我对不起,请仔细阅读这个问题。我没有问这个用法。 –

0

您可以尝试

private static final DateTimeFormatter formatter = 
       DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").withResolverStyle(ResolverStyle.LENIENT); 
+0

谢谢你的答案,但那不是我想要的。为此,我必须以正确的格式提供文本。这是一种不同的方式。 –