在应用程序中强制使用公历

问题描述 投票:0回答:2

我有一个与公历完美配合的应用程序。应用程序中的所有API数据和日期计算均基于公历。但是,当用户将设备设置为不同的日历类型(例如佛教日历)时,我会遇到崩溃。

例如,当非公历处于活动状态时,以下函数会崩溃:

func days(from date: Date) -> Int {
    let beginningOfDay = date.beginningOfDay ?? date
    return Int(timeIntervalSince1970 - beginningOfDay.timeIntervalSince1970) / Int(TimeInterval.day)
}

问题: 我想忽略用户的日历设置并在整个应用程序中强制执行公历。 我知道日历转换器,但我不想单独转换日期。相反,我需要一种方法来确保公历在整个应用程序中一致应用。

问题: 有没有办法在整个应用程序中强制使用公历,以便所有与日期相关的功能和操作都遵循它?如果是这样,我该如何实施?

ios swift swift4
2个回答
4
投票

这看起来您在

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)
(如果这就是您的意思)。


0
投票

我正在开发 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]
,它似乎通过始终返回公历来解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.