异常描述
通过hive 时间函数查询 前一天的日期,业务反馈发现返回时时间在 星期存在跨年的情况时候,返回下一年的 日期
异常分析
在大多数情况下,yyyy 被用来表示年份。然而,许多开发者会接触到大写的 YYYY,并错误地将其视为与 yyyy 等同。
YYYY 与 yyyy 的区别
yyyy:基于日历年的年份。一个日历年从 1 月 1 日开始,到 12 月 31 日结束。例如,2024-01-01 和 2024-12-31 都属于年份 2024。
YYYY:基于 ISO 8601 标准的周年份。周年份的开始和结束取决于该年的第一个星期一。也就是说,周年份的起点不一定是 1 月 1 日。例如,2024 年的第一周可能会从 2023 年的最后几天开始,因此 YYYY 和 yyyy 可能在年初和年末产生不同的结果。
典型陷阱
总的来说,YYYY 如果周存在跨年的情况时候,yyyy 和YYYY并不等效,而是出现了跨年。
为了更好地理解 YYYY 的陷阱,让我们看一些具体的例子和代码示例。
例子 1:新年前夕
假设当前日期是 2023 年 12 月 31 日,星期一。根据 ISO 8601 标准,这一天属于 2024 年的第一周。因此:
使用 yyyy 格式化:2023
使用 YYYY 格式化:2024
该问题spark 时间函数也存在,这是由于底层 JDK 获取时间规则引发,不属于bug。
参考
https://cloud.tencent.com/developer/article/2427144