我有一个可以与公历类型正常工作的应用程序。日期的所有 API 信息均采用公历类型。但如果用户有佛教日历,我会在某些地方崩溃。例如:
func days(from date: Date) -> Int {
let beginningOfDay = date.beginningOfDay ?? date
return Int(timeIntervalSince1970 - beginningOfDay.timeIntervalSince1970) / Int(TimeInterval.day)
}
如何在整个应用程序中忽略日历的用户设置并强制日期采用公历?可以吗?
我刚刚创建了转换器,但我不想转换,我只是想在整个应用程序上强制使用公历。
谢谢
这看起来您在
Date
上添加了很多不属于那里的扩展。 Date
是一个时间点。为了谈论“天”,你应该调用 Calendar
和 DateComponents
方法。无论如何,这个函数并不完全正确。根据夏令时的变化,它可能会关闭一天。你不能假设一天是 24 小时;有些是25小时,有些是23小时。
您想要的代码是:
let calendar = Calendar(identifier: .gregorian)
calendar.dateComponents([.day], from: d1, to: d2).day!
您的扩展中的某个地方可能有
Calendar.current
。这意味着“当前用户日历”。无法告诉系统“即使我明确要求当前用户日历,请给我其他内容。”查找使用 Calendar.current
的代码,并将其替换为 Calendar(identifier: .gregorian)
(如果这就是您的意思)。
我找到了一种(基本上)做到这一点的方法。从 iOS 18.1 开始,我在使用日本日历时遇到了问题,我需要类似的解决方案。虽然我们无法改变 [NSCalendar currentCalendar] 发生的情况,但我找到了一种不使用它的方法。我创建了一个 NSCalendar 类别并添加了以下内容:
+ (NSCalendar *)adjustedCalendar {
NSCalendar *cal = [NSCalendar currentCalendar];
if (cal.calendarIdentifier == NSCalendarIdentifierJapanese) {
cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
}
return cal;
}
我不调用 currentCalendar,而是调用 adjustmentCalendar,它总是给我一个公历日历。