我有这个简单的代码(Xcode iOS应用程序)
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Button(action: {
let dateToday = Date()
let dateOneYearAgo = Calendar.current.date(byAdding: .year, value: -1, to: dateToday) ?? dateToday
print("dateToday: \(dateToday) - dateOneYearAgo: \(dateOneYearAgo)")
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY-MM-dd"
let dateTodayString = dateFormatter.string(from: dateToday)
let dateOneYearAgoString = dateFormatter.string(from: dateOneYearAgo)
print("dateTodayString: \(dateTodayString) - dateOneYearAgoString: \(dateOneYearAgoString)")
}, label: {
Text("Test").font(.largeTitle)
})
}
.padding()
}
}
如果我在模拟器中运行它,它会打印出来
日期今天:2022年12月29日17:24:37 +0000-日期一年前:2021年12月29日17:24:37 +0000今日日期字符串:2022年12月29日-日期一年前字符串:2022-12-29
如果我在Swift Playgrounds中运行,则只需执行如下操作结束:
import Foundation
let dateToday = Date()
let dateOneYearAgo = Calendar.current.date(byAdding: .year, value: -1, to: dateToday) ?? dateToday
print("dateToday: \(dateToday) - dateOneYearAgo: \(dateOneYearAgo)")
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY-MM-dd"
let dateString = dateFormatter.string(from: dateToday)
let dateOneYearAgoString = dateFormatter.string(from: dateOneYearAgo)
print("dateToday: \(dateString) - dateOneYearAgo: \(dateOneYearAgoString)")
它给我:
日期今天:2022年12月29日17:27:32 + 0000-日期一年前:2021年12月29日17:27:32 +0000今日日期字符串:2022年12月29日-日期一年前字符串:2021-12-29
我希望日期OneYearAgoString始终为2021 - 12 - 29。
我错过了什么?
2条答案
按热度按时间67up9zun1#
您的问题的主要原因是在
dateFormat
中错误使用YYYY
。您需要在当年使用yyyy
。YYYY
与此类似,但通常在当年最后一周的后半周(如现在)给出错误结果。请参阅日期字段符号表并查看y和Y之间的区别。
至于为什么模拟器中的SwiftUI代码给出的结果与Playground中的Swift代码不同,我怀疑这与两者使用的默认语言环境和/或日历有关。无论如何,正确使用
yyyy
表示年份将在两个地方得到正确的结果。9q78igpj2#
正如@HangarRash的评论中提到的,YYYY日期格式导致了这种情况。
使用yyyy而不是YYYY。后者是日历中星期的日期格式化程序标记。