关于时间格式化问题总结:
- 在现在开发的项目中存在一个是通过年份and其他条件查询的查询方法,在平日里从来没有出现问题,而在2018年12月30日开始就无法查到返回值,一直是空值。我把sql单独摘取出来在数据库查询并没有问题。于是我去查询每一条打印日志,发现了一个问题,前面时间点是2018.12.30但是查询条件截取的却是2019年,检查代码获取时间是new Date() 并没有什么问题,猜想可能是格式化问题。下面是当时格式化的代码:
1 | SimpleDateFormat sdf = new SimpleDateFormat("YYYY"); |
因为平时并没有在意Y和y(平时使用没有区别),从到导致问题的发生。下面说一下Y和y的区别:
- Y表示Week year
- y表示 year
Week year的具体意思就是当天所在周隶属的年份,每周都是从周日开始,周六结束,如果本周是跨年周,那么这周就会被计入下一年。下面是2018年12月份日历:
我们可以看到12月30日这天所在周正好是跨年周,而且30号还是周日,所以也就发生上面的事情,明明是2018年,截取年份却出现了2019年。
- 通俗来讲也是说12月30日这天,如果格式化时使用
1
SimpleDateFormat sdf = new SimpleDateFormat("YYYY");
sdf.format(new Date()) ====> 2019
如果使用1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
sdf.format(new Date()) ====> 2018
总结
平时我们在格式化时间时请使用 yyyy 格式,尽量不要使用YYYY格式给自己带来不必要的麻烦。