Java强校验日期格式

SimpleDateFormat

// lenient默认为true,即为宽松模式,如需严格校验,则需设置lenient为false
String date = "2021/02/29";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
sdf.setLenient(false);
// 抛错
sdf.parse(date);

DateTimeFormatter

// ResolverStyle默认为SMART,即以聪明的方式解决日期和时间,如需严格校验,设置为STRICT,另外还存在LENIENT宽松模式
String date = "2021/02/29";
DateTimeFormatter df = DateTimeFormatter.ofPattern("uuuu/MM/dd", Locale.getDefault()).withResolverStyle(ResolverStyle.STRICT);
// 抛错
LocalDate.parse(date, df);

在STRICT严格模式下,需注意

在Javadoc节模式用于格式化和解析为DateTimeFormatter它列出了以下3个相关的符号:

Symbol  Meaning        Presentation  Examples
------  -------        ------------  -------
 G       era            text          AD; Anno Domini; A
 u       year           year          2004; 04
 y       year-of-era    year          2004; 04
仅作比较,这些其他符号很容易理解:

 D       day-of-year    number        189
 d       day-of-month   number        10
 E       day-of-week    text          Tue; Tuesday; T
的day-of-year,day-of-month和day-of-week显然是当天在给定范围(年,月,周)内.

因此,year-of-era表示给定范围(时代)内的年份,并且正上方era显示的是示例值AD(当然是其他值BC).

year是签署的年份,年份0是1 BC,年份-1是2 BC等等.

举例说明:朱利叶斯凯撒何时被暗杀?
	公元前44年3月15日(使用模式MMMM d, y GG)
	3月15日-43(使用模式MMMM d, u)
	
当然,区别仅在于年份是零还是负面,而且由于这种情况很少见,大多数人都不关心,即使他们应该这样做.

结论:如果你使用y你也应该使用G.由于G很少使用,因此正确的年份符号u不是y,否则非正年将显示不正确.

这被称为防御性编程:

防御性编程是一种防御性设计,旨在确保在不可预见的情况下软件的持续功能.

注意DateTimeFormatter与SimpleDateFormat以下内容一致:

Letter  Date or Time Component  Presentation  Examples
------  ----------------------  ------------  --------
G       Era designator          Text          AD
y       Year                    Year          1996; 96
负面年份一直是一个问题,他们现在通过添加修复它u.

原文地址:http://www.cnblogs.com/Zzzyyw/p/16876569.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性