程序员别再犯错!日期格式中的"YYYY"和"yyyy"大不同!

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

关于时间的显示可以说是我们做开发经常用到的知识点了,你肯定用过下边的代码:

ini 复制代码
import Foundation

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY/MM/dd"

但我今天要告诉你,其中的 YYYY 这么使用其实是错的,如果我们想显示日期的年份,我们需要使用小写的 "yyyy"。

YYYY 导致的问题

那么为什么说 "YYYY" 是错的呢,和 yyyy 的区别又是啥呢?

  • yyyy:表示公历年的年数。这一天在哪一年就是哪一年,例如,2023-05-01 年就是 2023。

  • YYYY :表示基于周的年份(Week-based year),它与 ISO 8601 标准一致。它表示的是这一周属于哪一年。

在大部分情况下,这两个用法得到的是一致的,但是在年初和年末的那几天,有可能导致不同的结果,最终会产生一年的误差。

举个例子

我们以 2024 年的最后一天 12 月 31 日举例,从日历中可以看出这一天是周二,这一周的后面几天都属于 2025 年了。

我们先用 yyyy 打印一下:

swift 复制代码
import Foundation
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let date = dateFormatter.date(from: "2024-12-31")!

dateFormatter.dateFormat = "yyyy"
print("公历年:")
print("2024-12-31 -> \(dateFormatter.string(from: date))") // 2024-12-31 -> 2024

可以看到最终的打印结果为 2024-12-31 -> 2024,输出正确。

然后再用大写的 YYYY 打印一下:

swift 复制代码
import Foundation
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let date = dateFormatter.date(from: "2024-12-31")!

dateFormatter.dateFormat = "YYYY"
print("基于周的年份:")
print("2024-12-31 -> \(dateFormatter.string(from: date))") // 2024-12-31 -> 2025

可以看到控制台打出了 2024-12-31 -> 2025,错误的输出,因为 2024 年 12 月 30 号和 31 号被包含在了 2025 年的第一周里。

代码是否应该修改?

这取决于你是否真正理解大写 Y 和小写 y 在含义上的区别,以及你对程序的结果预期,如果你的日期展示需要显示公历年,需要使用小写 y。如果你需要显示以周为单位的年数,需要使用大写 Y(大部分都是前者)。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
名字不要太长 像我这样就好3 分钟前
【iOS】继承链
macos·ios·cocoa
karshey1 小时前
【IOS webview】IOS13不支持svelte 样式嵌套
ios
潜龙95271 小时前
第4.3节 iOS App生成追溯关系
macos·ios·cocoa
游戏开发爱好者810 小时前
iOS App 电池消耗管理与优化 提升用户体验的完整指南
android·ios·小程序·https·uni-app·iphone·webview
程序员老刘16 小时前
AI智能体正在颠覆App开发,不转型就淘汰
flutter·客户端·mcp
神策技术社区17 小时前
iOS 全埋点点击事件采集白皮书
大数据·ios·app
wuyoula17 小时前
iOS V2签名网站系统源码/IPA在线签名/全开源版本/亲测
ios
2501_9159184118 小时前
iOS 性能监控工具全解析 选择合适的调试方案提升 App 性能
android·ios·小程序·https·uni-app·iphone·webview
fishycx18 小时前
iOS 构建配置与 AdHoc 打包说明
ios
冉冉同学18 小时前
【HarmonyOS NEXT】解决Repeat复用导致Image加载图片展示的是上一张图片的问题
android·前端·客户端