java - 三十ABP : How to validate date using a custom date format/DateTimeFormatter?

标签 java android threetenbp

我正在使用ThreeTenABP并且似乎在 LocalDate.parse(String) 和 LocalDate.parse(String, DateTimeFormatter) 之间遇到了实现差异。

LocalDate.parse("31/02/1985", DateTimeFormatter.ofPattern("dd/MM/yyyy"))

解析为“1985-02-28”而不引发异常。

LocalDate.parse("2015-02-31")

DateTimeParseException:无法解析文本“2015-02-31”:无效日期“FEBRUARY 31”

documentation 几乎暗示了这一点,“字符串必须表示有效日期”仅在无格式化程序方法中提到。

如何使用 Threeten bp 验证自定义格式(如 31/02/1985)的日期?

最佳答案

主要区别可以通过以下事实来解释:ISO_LOCAL_DATE 格式默认情况下是严格的。其他格式化程序有 smart默认情况下。您引用的完整句子如下:

The string must represent a valid date and is parsed using DateTimeFormatter.ISO_LOCAL_DATE.

所以很明显,无格式化程序的方法只能在严格模式下解析 ISO 兼容的日期,即使这样也只能是 subset of ISO-8601 ,即:

uuuu-MM-dduuuuMMdd

关于严格模式,可以看学习source code :

   public static final DateTimeFormatter ISO_LOCAL_DATE; 
   static { 
     ISO_LOCAL_DATE = new DateTimeFormatterBuilder() 
       .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD) 
       .appendLiteral('-') 
       .appendValue(MONTH_OF_YEAR, 2) 
       .appendLiteral('-') 
       .appendValue(DAY_OF_MONTH, 2) 
       .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE); 
     } 

但是,严格模式似乎没有很好的文档记录。不管怎样,如果你想用自定义格式化程序实现严格模式,那么只需调用它的方法 withResolverStyle(ResolverStyle.STRICT) .

关于java - 三十ABP : How to validate date using a custom date format/DateTimeFormatter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32812262/

相关文章:

java - 将 java.time 类从 java 8 转换为 java 5

java - 如何正确使用 ThreeTenABP 获取基于 UTC 的两个日期之间的时间(以毫秒为单位)

android - 如何在 Retrofit 中反序列化 ThreeTen LocalDateTime?

java - 从 SD 卡解压文件

java - map View 显示黑色区域

android - 在 kotlin 中创建常量文件的最佳做法是什么

android - Android EditText中的垂直内容对齐

android - 无法更新当前行 ListView ,我的代码在下面给出

java - AsyncTask 嵌套类还是自己的类?

java - Android kotlin accountkit - 无法正常工作