在整个应用程序上设置日历类型

问题描述 投票: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 18.1 开始,我在使用日本日历时遇到了问题,我需要类似的解决方案。虽然我们无法改变 [NSCalendar currentCalendar] 发生的情况,但我找到了一种不使用它的方法。我创建了一个 NSCalendar 类别并添加了以下内容:

+ (NSCalendar *)adjustedCalendar {
    
    NSCalendar *cal = [NSCalendar currentCalendar];
    
    if (cal.calendarIdentifier == NSCalendarIdentifierJapanese) {
        cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    }
    
    return cal;
}

我不调用 currentCalendar,而是调用 adjustmentCalendar,它总是给我一个公历日历。

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