我想获取非公历一年中的月份数。 例如,在希伯来历中,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 天)。
这是因为希伯来历中
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!
}