为什么Xcode和模拟器给予我不同的日期?

ddarikpa  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(154)

我有这个简单的代码(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。
我错过了什么?

67up9zun

67up9zun1#

您的问题的主要原因是在dateFormat中错误使用YYYY。您需要在当年使用yyyyYYYY与此类似,但通常在当年最后一周的后半周(如现在)给出错误结果。
请参阅日期字段符号表并查看y和Y之间的区别。
至于为什么模拟器中的SwiftUI代码给出的结果与Playground中的Swift代码不同,我怀疑这与两者使用的默认语言环境和/或日历有关。无论如何,正确使用yyyy表示年份将在两个地方得到正确的结果。

9q78igpj

9q78igpj2#

正如@HangarRash的评论中提到的,YYYY日期格式导致了这种情况。
使用yyyy而不是YYYY。后者是日历中星期的日期格式化程序标记。

相关问题