Lenient Java 8日期解析

时间:2015-10-06 05:35:08

标签: java java-8 java-time

我想解析2015-10-01'与bool aNewBarEVENT( const string anFxSYMBOL, // _Symbol, const int aTimeFRAME // PERIOD_M6 ) { static int pBars = EMPTY; // previous int oBars = iBars( anFxSYMBOL, aTimeFRAME ); // observed if ( pBars == oBars ) return( False ); // .NACK pBars = oBars, return( True ); // .UPD + .ACK } 。我要做的是

LocalDateTime

但是我想像

一样解析它
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);

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

4 个答案:

答案 0 :(得分:7)

如果要将日期字符串解析为"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)来完成的。如果要解析的String中不存在该字段,则此方法将获取该字段的字段和默认值。因为在我们的情况下,时间信息不会出现在字符串中,所以将选择默认值,即该字段的有效值范围的最小值(通过调用getMinimum到该字段的ValueRange;也许我们也可以在这里硬编码0。

如果要解析的String可能包含时间信息,我们可以使用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));

答案 1 :(得分:0)

解析日期和时间

要从字符串创建private void createDirectoryAndSaveFile(Bitmap imageToSave, String fileName) { File direct = new File(Environment.getExternalStorageDirectory() + "/DirName"); if (!direct.exists()) { File wallpaperDirectory = new File("/sdcard/DirName/"); wallpaperDirectory.mkdirs(); } File file = new File(new File("/sdcard/DirName/"), fileName); if (file.exists()) { file.delete(); } try { FileOutputStream out = new FileOutputStream(file); imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } 对象,您可以使用静态LocalDateTime方法。它需要一个字符串和一个LocalDateTime.parse()作为参数。 DateTimeFormatter用于指定日期/时间模式。

DateTimeFormatter

格式化日期和时间

要从String str = "1986-04-08 12:00"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); LocalDateTime dateTime = LocalDateTime.parse(str, formatter); 对象创建格式化字符串,可以使用format()方法。

LocalDateTime

请注意,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实例将导致字符串" 1986-04-08T12:30:00"。

LocalDateTime()和parse()方法适用于所有与日期/时间相关的对象(例如LocalDate或ZonedDateTime)

答案 2 :(得分:0)

你可以尝试

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

答案 3 :(得分:0)

针对特定用例的简单解决方案是定义自己的格式。在此示例中,即使我在模式中为月份指定了一个M,也为一天指定了一个d,它仍然将两个示例解析为相同。

@Test
public void parsing_singleDigitDates_andDoubleDigitDates_areEqual()
{
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-M-d");

    LocalDate dt1 = LocalDate.parse("2015-09-05", fmt);
    LocalDate dt2 = LocalDate.parse("2015-9-5", fmt);

    Assert.assertEquals(dt1, dt2);
}

在看到DateTimeFormatterBuilder需要您编写才能解决相同问题的代码后,我决定写这个答案。