LocalDate epochDay格式休息一天

时间:2018-10-24 22:10:45

标签: java kotlin

我正在尝试使用Java8的LocalDate API将日期字符串转换为epoch Day。 当我尝试验证转换时,实际上是一天假!

这是测试

const val DATE_PATTERN = "MMMM d, yyyy"
    @Test
    fun `parse handles different cases`(){
        val case1 = "September 31, 2018"
        val dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN, Locale("en", "US"))
        val date1: Long = LocalDate.parse(case1, dateTimeFormatter).toEpochDay()
        val case1Res = LocalDate.ofEpochDay(date1).format(dateTimeFormatter)
        assertEquals(case1, case1Res)
     }

断言失败

expected: <September 31, 2018> but was: <September 30, 2018>

1 个答案:

答案 0 :(得分:3)

评论指出,实际上,9月有30天。解析不正确的日期时此代码不会引发错误的原因是默认情况下DateFormatter宽松,这意味着您可以在2018年9月64日通过,它将很高兴为您解析并生成正确的纪元日期。

您可以通过添加严格的解析器样式来使DateFormatter在错误的日期上引发错误,如下所示:

DateTimeFormatter
    .ofPattern(DATE_PATTERN, Locale("en", "US"))
    .withResolverStyle(ResolverStyle.STRICT)

解析指定的日期时将导致以下错误:

Text 'September 31, 2018' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {YearOfEra=2018, MonthOfYear=9, DayOfMonth=31},ISO of type java.time.format.Parsed