Java日期格式化中的“YYYY”陷阱:为什么跨年周会让你的年份突然+1?.md
结论先行
在Java中使用 YYYY-MM-dd 格式化日期时,若日期所在的周跨年,年份可能会被错误计算为下一年(如2021年12月26日显示为2022年)。而使用 yyyy-MM-dd 会始终返回正确的年份。问题的根源是 YYYY 和 yyyy 对年份的定义不同:YYYY 是「基于周的年份」,而 yyyy 是「自然年份」。
文章持续更新,可以微信搜一搜「 半个脑袋儿 」第一时间阅读
问题复现
尝试用以下代码格式化 2021-12-26:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatDemo {
public static void main(String[] args) {
SimpleDateFormat sdf1 = new SimpleDateFormat("YYYY-MM-dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date(121, 11, 26); // 2021年12月26日
System.out.println(sdf1.format(date)); // 输出:2022-12-26
System.out.println(sdf2.format(date)); // 输出:2021-12-26
}
}
结果差异明显,YYYY 的年份跳到了2022年。
原因解析
1. YYYY 是「基于周的年份」
- 定义:
YYYY遵循 ISO 8601 标准,表示「日期所在周所属的年份」。 - 周的计算规则:
- 默认一周从 周日开始,到 周六结束(可通过
Locale调整,如某些地区从周一开始)。 - 若某周跨年(即该周包含新年的第一天),则这一周会被归属到新年所在的年份。
- 默认一周从 周日开始,到 周六结束(可通过
以 2021年12月26日 为例:
- 该周为 2021年12月26日(周日)至2022年1月1日(周六)。
- 由于这一周的大部分天数(4天)属于2022年,因此
YYYY会将其归属到2022年。
2. yyyy 是「自然年份」
- 定义:
yyyy直接表示日期所在的自然年份,与周无关。 - 无论日期是否跨周或跨月,始终返回实际年份。
如何避免踩坑?
优先使用
yyyy
除非明确需要基于周的年份计算,否则格式化日期时应使用yyyy。理解业务场景
- 财务系统、周报统计等可能需要
YYYY(如按周生成报表)。 - 普通日期场景(如订单时间、日志记录)应使用
yyyy。
- 财务系统、周报统计等可能需要
注意
Locale的影响- 不同地区的周起始日不同(如美国默认周日开始,欧洲多从周一开始)。
- 可通过
SimpleDateFormat.setLocale()或DateTimeFormatter.withLocale()指定区域。
Java 8+ 的替代方案
使用DateTimeFormatter时,yyyy对应Y和u的行为更清晰:LocalDate date = LocalDate.of(2021, 12, 26);
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("YYYY-MM-dd");
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd"); System.out.println(date.format(formatter1)); // 2022-12-26
System.out.println(date.format(formatter2)); // 2021-12-26
总结
YYYY与yyyy的区别:基于周的年份 vs 自然年份。- 根本原因:跨年周的归属规则导致
YYYY的年份偏移。 - 最佳实践:若无特殊需求,始终使用
yyyy-MM-dd格式化日期。
一个小小的格式字符差异,可能导致跨年时的严重逻辑错误。切记:日期格式化无小事!
Java日期格式化中的“YYYY”陷阱:为什么跨年周会让你的年份突然+1?.md的更多相关文章
- Java日期格式化带来的年份不正确
BUG现场 一个线上项目之前一直运行得很稳定,从没出过数据错误的问题,但是在2021.12.26这天却"意外"地出现了数据计算错误. 刚开始一头雾水,不知道是什么问题,后来经过日志 ...
- java 时间格式化中的模式字母
java日期格式化中的模式字母有特定的意义,由于没有注意,今天在做工程的时候导致出现了奇怪的日期: 错误写法如下: 然而得到了错误的结果: 正确写法如下: 这样就得到了正确的结果 mm指的是分钟,MM ...
- Java日期格式化方法
首先获取当前系统时间的方法有两种:第一种可以用currentTimeMillis()方法获取,它其实产生的是一个当前的毫秒数,这个毫秒是自1970年1月1日0时起至现在的毫秒数,类型是long 型,可 ...
- java 日期格式化-- SimpleDateFormat 的使用。字符串转日期,日期转字符串
日期和时间格式由 日期和时间模式字符串 指定.在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素.文本可以使用单引 ...
- Java日期格式化
翻译人员: 铁锚 翻译时间: 2013年11月17日 原文链接: Simple example to show how to use Date Formatting in Java 代码示例如下, ...
- Java——日期格式化YYYYMMdd与yyyyMMdd的区别
public static void main(String[] args) { //YYYY 是表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年. //20 ...
- Java日期格式化及其使用例子收集
1 SimpleDateFormat担当重任,怎样格式化都行 import java.util.Date; import java.text.SimpleDateFormat; public clas ...
- Java 日期格式化,Java 日期工具类,Java Date工具类
================================ ©Copyright 蕃薯耀 2020-01-19 https://www.cnblogs.com/fanshuyao/ import ...
- java 日期格式化
DateFormat DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. SimpleDateFormat SimpleDateFormat 是一个以与 ...
- java日期格式化(util包下转成sql包下)
package test; import java.text.SimpleDateFormat;import java.util.Date;import java.util.Scanner; publ ...
随机推荐
- python 输入与输出函数,格式化输出,注释,变量,整数,浮点数,字符串,布尔等说明
python 输入函数:input 语法:input("提示文字") 注意:用input输入的内容都是字符串: 输出函数:print 语法:print() -------- ...
- npm i 下载太慢
1.在项目内部进入终端 2.输入:npm config set registry https://registry.npmmirror.com 修改npm下载地址为淘宝 3.然后再执行 npm i 进 ...
- Typecho输出html颜色字教程
!!! 这里是红色 !!! !!! 这里是绿色 !!! typecho输出html教程 只需要用!!!包裹html即可实现! 用法 !!! <font color="red" ...
- docker - [03] docker原理
题记 一.docker是怎么工作的 docker是一个CS(Client - Server)结构的系统,docker的守护进程运行在主机上,通过Socket从客户端访问. docker Server接 ...
- idea中启动web、jsp项目
1. idea打开项目 选择要打开的项目的根目录 2. 项目配置 配置jdk modules配置 添加web 添加依赖 删除爆红的依赖 添加依赖目录或者jar 配置web.xml 配置lib 如果没有 ...
- P4688 [Ynoi Easy Round 2016] 掉进兔子洞
莫队可以维护种类数 但是无法维护出现次数 考虑离散化以后我们后面腾出了一些空位 那么我们就可以填进那些坑里面 这样做我们就可以用 bitset 直接做与运算 那么 莫队 + bitset 即可
- CPrimerPlus
还没学 的 167页的wordcnt程序 199页的checking程序(太长了,不想看) 113页的第八章编程练习5(不想看) 125页的复习题9(有问题,有时间再来验证) 119页重定向和文件(n ...
- 怎么解决DB读写分离,导致数据不一致问题?
前言 在互联网中大型项目中,读写分离应该是我们小伙伴经常听说的,这个主要解决大流量请求时,提高系统的吞吐量.因为绝大部分互联网产品都是读多写少,大部分都是读请求,很小部分是写请求. 上图: 1)一个主 ...
- 云服务器下如何部署Django项目详细操作步骤
前期本人完成了"编写你的第一个 Django 应用程序",有了一个简单的项目代码,在本地window系统自测没问题了,接下来就想办法部署到服务器上,可以通过公网访问我们的Djang ...
- Win环境下的批处理命令和JScript脚本结合使用笔记
最近工作有接触到.bat 批处理命令,在Win环境下编写的时候基于以前的编码习惯,觉得批处理语法可读性较差,于是学习了解了一下结合JScript的用法,特此记录. 什么是JScript JScript ...