当前位置:首页 > 每日看点 > 正文内容

yyyy-mm-dd日期格式跟yyyy-m-d有什么区别?

卡卷网1年前 (2025-01-19)每日看点282

“YYYY-MM-dd”格式陷阱

前言

yyyy-mm-dd日期格式跟yyyy-m-d有什么区别?  第1张

在元旦假期后的第一个工作日,我正准备买年货,却在使用一款 App 时意外发现了一个令人哭笑不得的 bug:我明明选择的是 2024 年 12 月 31 日出发,可 App 上显示的日期却变成了 2025 年 12 月 31 日。

一时间,我惊慌失措,以为自己下错了订单,甚至半开玩笑地想,是不是该把程序员拉去“祭天”了。

但转念一想,这种错误可能源于程序员在日期格式化时的粗心大意。

我以前学 Java 时就曾留意过这个问题,既然有程序员可能因此“背锅”,那我有必要把这个问题拿出来好好说说,希望能帮助大家避免类似的失误,毕竟这种问题在常规测试中确实难以被发现.

日期格式化陷阱剖析

先来看一段 Java 代码:

public class DateTest { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.set(2024, Calendar.AUGUST, 31); Date strDate = calendar.getTime(); DateFormat formatUpperCase = new SimpleDateFormat("yyyy-MM-dd"); System.out.println("2024-08-31 to yyyy-MM-dd: " + formatUpperCase.format(strDate)); formatUpperCase = new SimpleDateFormat("YYYY-MM-dd"); System.out.println("2024-08-31 to YYYY/MM/dd: " + formatUpperCase.format(strDate)); } }

这段代码的目的是将日期 2024-08-31 分别按照 yyyy-MM-dd 和 YYYY-MM-dd 的格式进行格式化输出。

运行结果如下:

2024-08-31 to yyyy-MM-dd: 2024-08-31 2024-08-31 to YYYY/MM/dd: 2024-08-31

从结果来看,两种格式化方式在这个日期下似乎没什么区别。

但当我们把日期改为 2024-12-31 时,情况就大不相同了:

calendar.set(2024, Calendar.DECEMBER, 31);

此时的运行结果是:

2024-12-31 to yyyy-MM-dd: 2024-12-31 2024-12-31 to YYYY-MM-dd: 2025-12-31

问题出现了!同样是表示年份的 y 和 Y,在跨年日期时却产生了截然不同的结果。

这绝非小事,用户看到这样的日期显示,肯定会一头雾水,甚至产生误会。

但我们作为开发者,绝不能懵懂无知,必须立刻查阅相关文档,搞清楚其中的奥妙.

y 和 Y 的区别

在 Java 的日期格式化中,y 和 Y 都是用来表示年份的,但它们有着本质的区别:

y 代表的是“year-of-era”,即“正正经经的年”,它严格按照公历纪年法来计算年份,从元旦(1 月 1 日)开始,到年末(12 月 31 日)结束。

因此,使用 yyyy 格式化 2024-12-31 时,输出结果是 2024-12-31,符合我们的常规认知.

Y 代表的是“week-based-year”,即“基于周的年份”。

它的计算方式与我们平时理解的年份有所不同,它是根据 ISO 周日历体系来确定的。

ISO 周日历规定,每年的第一周必须包含该年的第一个周四。

也就是说,如果某年的第一天(1 月 1 日)是周一、周二或周三,那么这一天会属于上一年的最后一周;如果 1 月 1 日是周四或之后的日期,那么这一天才会属于当年的第一周。

因此,当一周跨越了年份,而这周的大部分日期属于下一年时,使用 YYYY 格式化日期就会显示下一年的年份。

以 2024 年 12 月 31 日为例,这一天是周二,而 2025 年的第一周是从 2024 年 12 月 30 日(周一)开始的,所以使用 YYYY 格式化 2024-12-31 时,输出结果是 2025-12-31,因为它属于 2025 年的第一周.

如何避免日期格式化错误

为了避免在日期格式化时出现类似的错误,我们可以采取以下措施:

  • 明确需求:在进行日期格式化之前,首先要明确业务需求,确定是要严格按照公历纪年法来表示年份,还是要根据 ISO 周日历来表示年份。如果是前者,就使用 yyyy;如果是后者,才使用 YYYY.
  • 代码审查:在代码开发过程中,要进行严格的代码审查,特别是涉及到日期格式化的部分。审查人员要仔细检查格式化字符串,确保使用正确的年份表示方式,避免因粗心大意而引入错误.
  • 测试覆盖:在测试阶段,要设计全面的测试用例,涵盖各种边界情况,包括跨年日期、闰年等。通过自动化测试和手动测试相结合的方式,确保日期格式化功能在各种情况下都能正确运行.
  • 文档学习:开发者要加强对日期格式化相关文档的学习,了解不同格式化符号的含义和使用场景。在遇到不确定的情况时,及时查阅官方文档,避免盲目使用导致错误.

总结

日期格式化看似是一个小问题,但一旦出错,就可能给用户带来极大的困扰,甚至影响整个项目的进度和质量。

因此,作为开发者,我们必须高度重视这个问题,从需求明确、代码审查、测试覆盖和文档学习等多方面入手,确保日期格式化的准确性,为用户提供稳定可靠的软件产品。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/10125.html

分享给朋友:

相关文章

下班后可以做点什么副业赚钱呢?

下班后可以做点什么副业赚钱呢?

首先说明一下,我分享的任务不需要交钱,也不需要入群,只需要你去平台学习就可以。如果有任何让你交钱,进群的任务,请警惕被割韭菜。今天给大家分享7大赚钱副业,新手小白0粉丝0门槛0技术都可以去做,不说大富大贵,但是赚个零花钱还是可以。如果你已经...

那些极速版软件其存在目的是什么?

那些极速版软件其存在目的是什么?

我看了很多回答,其实都没有回答道点子上。你知道极速版APP为什么叫极速版吗?是他看视频更快吗?显然不是。只是它的安装包体积更小,下载安装速度更快而已,所以叫极速版app。当然啦,现在极速版APP和原声版APP,安装包已经没有区别了,这是因为...

电视上哪个软件可以免费看电视直播?

电视上哪个软件可以免费看电视直播?

今天给大家推荐8款免费电视端直播看剧软件,感兴趣的朋友可以下载试一试!1、超级ITV 6.04免费看电视直播,央视卫视高清秒播,还有电影电视剧少儿体育等。2、小鲸电视 1.3.1小鲸电视是一款智能电视应用,集成了多个内容来源,包括腾讯视频、...

你是如何在不依靠工资收入的情况下赚到一万元的?

你是如何在不依靠工资收入的情况下赚到一万元的?

分享几个路子稳,门槛低,变现快,适合年轻人的靠谱的副业。绝对不是送外卖、滴滴、搬砖等等的苦力活,这几个副业都是能是性价比极高,还能让你快速成长的工作。想通过副业实现暴富、立马月入过万的同学,建议速速划走。今天撇哥就给大家分享100+个靠谱赚...

为什么有人觉得华为mate60只值2000?

为什么有人觉得华为mate60只值2000?

你以为买Mate60的人真的傻?真的那么爱国?国庆前,我家那傻子加价800多买了一台Mate60,当时还被我骂他是傻子。可是他说一回到公司就被老板同事朋友看到,拿去反复查看,都在惊叹他这么快就买到新机。跟亲戚朋友聚会,别人一看就知道他买的是...

在 Kubernetes 中,Service 的实现原理是什么,它是如何实现服务发现的?

行,问的这个问题挺有意思,Kubernetes 里 Service 是怎么实现的,服务发现是怎么回事,咱就直说了。这事儿看起来挺玄乎,但掰开揉碎了讲,也就那么回事。你得把这事儿想得简单点,别一上来就被啥术语吓住了——其实全是些搬砖的套路。咱...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。