获取非公历一年中的月份数

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

我想获取非公历一年中的月份数。 例如,在希伯来历中,5784 年有 13 个月,但 5783 年有 12 个月。

我尝试过:

public extension Calendar {
    
    /// The range of months for a given year in the calendar
    func monthRange(year: Int) -> Range<Int> {
        let components  = DateComponents(calendar:  self,
                                         year:      year,
                                         month:     1,  //  I assume 1 is always valid
                                         day:       1)  //  I assume 1 is always valid
        let date        = self.date(from: components)!
        let monthRange  = self.range(of: .month, in: .year, for: date)!
        return monthRange
    }
}

运气不佳(结果始终为 1..<14).

请注意:

public extension Calendar {

    func dayRange(year: Int, month: Int) -> Range<Int> {
        let components  = DateComponents(calendar:  self,
                                         year:      year,
                                         month:     month,
                                         day:       1)  //  I assume 1 is always valid
        let date        = self.date(from: components)!
        let dayRange    = self.range(of: .day, in: .month, for: date)!
        return dayRange
    }
}

工作正常(至少对于公历来说,闰年二月确实为 29 天,否则为 28 天,其他月份为 30/31 天)。它也适用于中国日历(30 或 31 天)。

swift calendar
1个回答
0
投票

这是因为希伯来历中

month
部分的含义。
month
值为 13 表示以禄 (Elul),1 表示提市利 (Tishri)。每年以禄月和提市利月都在,所以范围始终是
1..<14

闰年和平年的区别在于值 6 代表的月份是否存在。 6 表示 Adar I,7 表示 Adar 或 Adar II,具体取决于是否是闰年。

如果您只是想知道今年是否有闰月,只需检查一年中的天数即可。

let components = DateComponents(calendar: self, year: year)
guard let date = components.date,
      let rangeOfDays = range(of: .day, in: .year, for: date) else {
    // something went wrong...
}
if rangeOfDays.upperBound > 380 {
    // leap year!
}
© www.soinside.com 2019 - 2024. All rights reserved.