从此
📄文章 #️⃣专题 🌐酷站 👨‍💻技术 📺 📱

🏠 » 📄文章 » 内容

 欢迎来访!

周年份格式化 YYYY 和常规年 yyyy 的区别、Swift DateFormatter 和 Java DateTimeFormatter 基于周的年份标准 ISO 8601

🕗2025-05-02👁️0

1.先上结论


若你在项目的格式化日期中使用了YYYY,那么赶紧修改成yyyy吧!赶紧去,跑着前进,Go!Go!Go!

下面来讲解一下原因!

2.举个Swift例子,其他语言也是相同情况,比如Java的 DateTimeFormatter.ofPattern("YYYY"):

//使用YYYY
let format = DateFormatter()
format.dateFormat = "YYYY.MM.dd"
var now = format.string(from: Date()) as String
print("YYYY:\(now)")
    
//使用yyyy
format.dateFormat = "yyyy.MM.dd"
now = format.string(from: Date()) as String
print("yyyy:\(now)")

你运行上面的代码的时候,可能不会有问题!!!但是我在写这篇文章的时候是2020年12月27日

 

看到结果后有几个问题:

  1. 为什么使用YYYY会打印“2021”?也就是说“YYYY”和“yyyy”有什么区别?
  2. 为什么本人刚刚说:你运行上面代码的时候,可能不会有问题!!!?也就是说什么时候不一样呢?

2.1 解答:“YYYY”和“yyyy”区别

苹果开发者文档Data Formatting GuideUse Format Strings to Specify Custom Formats中有相关的解释

大概意思:

  • yyyy使用的是日历年,我们应该使用日历年这种方式
  • YYYY使用的是当前周所在的年份(Week of Year)
  • 大部分情况下这两种方式的值是一样的

2.2 解答:什么情况下会不一样

这个我们就得了解一下什么是 基于周的年份(Week-based year),当前周所在的年份!

  • 如果week(周)没有包含1月1日(没有跨年),那么week就属于当前所在的年
  • 如果week包含了1月1日(跨年了),那么week就属于新的一年
  • 2020年12月27日是周日,而周日是一周的开始。所以如果26日运行这个例子,年份上显示是没有问题的。而从2020年12月27日 00:00:00开始显示会有问题!

3.总结


所以说在大部分的情况下YYYYyyyy的值是一样的,只有在跨年的时候会出现问题。

项目中如果涉及到优惠券有效期展示而且使用了YYYY格式化年份,你就呵呵...

总结下,若要格式化输出日期中使用到,一定要使用yyyy这种方式!!!