我正在尝试使用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>
答案 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