今年你因为 YYYY-MM-dd 出BUG了吗

本文解析了一个关于日期格式处理的问题,在项目中前端发送给后端的时间为2021-12-26,但后端返回的时间却是2022-12-26。通过分析发现原因是后端采用了YYYY-MM-dd而非yyyy-MM-dd格式处理日期,导致2021年的最后一周被计为2022年。

在做项目的时候 明明传给后端的时间是 2021-12-26 但是后端却返回了 2022-12-26
这是为什么呢 后端错写了时间吗 经后端排查发现 后端采用YYYY-MM-dd 将时间返回 而不是yyyy-mm-dd

YYYY-MM-ddweek-based-year,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。
因为YYYY是week-based-year,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。
所以2021年12月26日那天在这种表述方式下就已经到 2022年了。
而当使用yyyy的时候,就还是 2021 年。

作者:程序猿DD
链接:https://juejin.cn/post/7045824361881665549
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### SQL 中日期时间格式化为 YYYY-MM-DD HH24:MI:SS 在不同的数据库管理系统 (DBMS) 中,可以使用特定的函数来实现日期时间的格式化操作。以下是针对几种常见 DBMS 的解决方案。 #### PostgreSQL PostgreSQL 提供 `to_char` 函数用于将日期或时间转换为指定格式的字符串。对于目标格式 `YYYY-MM-DD HH24:MI:SS`,可以通过以下方式完成: ```sql SELECT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS'); ``` 此语句会返回当前时间戳并按照指定格式进行显示[^1]。 --- #### Oracle Oracle 数据库也支持通过 `to_char` 函数来进行日期格式化的处理。同样地,为了得到 `YYYY-MM-DD HH24:MI:SS` 格式的字符串表示形式,可以执行如下查询: ```sql SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; ``` 这里需要注意的是,在 Oracle 中,`HH24` 是用来定义 24 小时制的时间部分的关键字[^2]。 --- #### MaxCompute/ODPS MaxCompute 或 ODPS 使用自定义格式字符串的方式对日期进行解析和重新构建。如果原始数据是非标准日期格式,则需先将其转化为标准日期对象再进一步调整为目标格式。下面是一个例子展示如何把非标准化输入转变为期望输样式 (`yyyy-MM-dd HH:mm:ss`) : ```sql SELECT FORMAT_DATETIME(CAST('2023/7/19' AS DATETIME), 'yyyy-MM-dd HH:mm:ss'); ``` 上述命令假设源数据能够被成功解释成内部 datetime 类型实例之后才调用外部封装好的辅助方法去生成最终结果[^3]。 --- #### 关于大小写字母含义差异说明 值得注意的一点是在 Java 和某些版本 SQL 实现里存在关于小时单位表达上的细微差别。“HH”通常代表基于一天内的上午下午划分即十二进制计数法下的钟点位置;而当提到全天候连续记录场景下则推荐采用“HH24”。另外还有月份标记"M"以及分钟标志"m",它们之间也可能引发混淆所以务必确认清楚具体上下文中所指代的确切意义[^4]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值