我正在尝试使用 Java8 的 LocalDate api 将日期字符串转换为纪元日。 当我尝试验证转换时,实际上休息了一天!
这是测试
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>
最佳答案
评论指出,9月确实有30天。此代码在解析不正确的日期时不会引发错误的原因是,DateFormatter 默认情况下是宽松的,这意味着您可以在 2018 年 9 月 64 日通过,它会很乐意为您解析它并生成正确的纪元日期。
您可以通过添加严格的解析器样式使 DateFormatter 在不正确的日期上抛出错误,如下所示:
DateTimeFormatter
.ofPattern(DATE_PATTERN, Locale("en", "US"))
.withResolverStyle(ResolverStyle.STRICT)
这将导致解析指定日期时出现以下错误:
无法解析文本“2018 年 9 月 31 日”:无法从 TemporalAccessor 获取 LocalDate:{YearOfEra=2018,MonthOfYear=9,DayOfMonth=31},类型为 java.time.format.Parsed
关于java - LocalDate epochDay 格式为休息一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52978589/