我有一个与公历完美配合的应用程序。应用程序中的所有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 应用程序,并在 iOS 18.1 中遇到了日语日历问题。具体来说,[NSCalendar currentCalendar] 的行为取决于系统的日历设置,这可能会导致我的应用程序不一致。
为了解决这个问题,我创建了一个 NSCalendar 类别,其方法确保在当前日历设置为日语时我始终获得公历。这是我写的代码:
+ (NSCalendar *)adjustedCalendar {
NSCalendar *cal = [NSCalendar currentCalendar];
if (cal.calendarIdentifier == NSCalendarIdentifierJapanese) {
cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
}
return cal;
}
我现在使用
[NSCalendar currentCalendar]
,而不是调用 [MyCalendar adjustedCalendar]
,它似乎通过始终返回公历来解决问题。