程序员别再犯错!日期格式中的"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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
初级代码游戏6 小时前
iOS开发 SwiftUI 8:NavigationView 导航
ios·swiftui·swift
美狐美颜SDK开放平台8 小时前
跨平台开发实战:直播美颜sdk动态贴纸在 Android / iOS / HarmonyOS 的落地方案
android·ios·harmonyos·美颜sdk·直播美颜sdk·视频美颜sdk·美颜api
2501_916008898 小时前
在不越狱前提下导出 iOS 应用文件的过程,访问应用沙盒目录,获取真实数据
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_915106328 小时前
Android和IOS 移动应用App图标生成与使用 Assets.car生成
android·ios·小程序·https·uni-app·iphone·webview
虹少侠8 小时前
基于 WebKit 构建 macOS 多浮窗视频播放的技术实践(含完整产品落地)
前端·macos·swift·webkit
2501_915918419 小时前
Mac 抓包软件有哪些?Charles、mitmproxy、Wireshark和Sniffmaster哪个更合适
android·ios·小程序·https·uni-app·iphone·webview
2501_915106329 小时前
iOS 抓包绕过 SSL 证书认证, HTTPS 暴力抓包、数据流分析
android·ios·小程序·https·uni-app·iphone·ssl
WeiAreYoung9 小时前
uni-app xcode 制作iOS Notification Service Extension 远程推送图文原生插件
ios·uni-app·xcode
2501_9159214317 小时前
iOS App 电耗管理 通过系统电池记录、Xcode Instruments 与克魔(KeyMob)组合使用
android·ios·小程序·https·uni-app·iphone·webview
且去填词1 天前
Context 详解:如何在微服务链路中传递取消信号与超时控制
ios·iphone