Swift Number Of Weeks in Month



我使用Swift 5。我想知道一个月有多少周。2021年1月打印6周,但5月打印5周。我认为问题是firstWeekday被设为1。是否有一种方法可以在不设置firstWeekday的情况下获得给定月份的周数?

var localCalendar = Calendar.current
localCalendar.firstWeekday = 1
let weekRange = localCalendar.range(of: .weekOfMonth, in: .month, for: dateFormatter.date(from: monthName)!)
if let weekRange = weekRange {
print("(monthName) has (weekRange.count) weeks.")
}

看来你根本不想要一个月的周数。您需要日历打印输出中的行数。

在标准格里高利历中表示一个月所需的行数公式如下:

从一个月的天数开始。在此基础上加上当月开始前空白的天数,从Sunday开始。例如,2021年1月是31 + 5 = 36,因为它有31天长,但在开始之前的5天(周日到周四)不是它的一部分。换句话说:2021年1月的第一天是星期五;如果我们把星期天称为第0天,那就是一周的第5天,所以我们得到31 + 5。

现在整除以7。我们至少需要这么多行。用整数除法(31+5)/7等于5。问题是:是我们需要的所有行吗?

求出该除法的余数。如果不为零,再加一行。所以(31+5)%7 = 1,这告诉我们需要多容纳一天所以我们需要另一行。6.

:

// `startingOn` pretends that Sunday is day 0
func rowsNeededForMonthWith(numberOfDays n: Int, startingOn i: Int) -> Int {
let (quot,rem) = (n+i).quotientAndRemainder(dividingBy: 7)
return quot + (rem == 0 ? 0 : 1)
}

下面是一些快速的健康测试:

// January 2021
rowsNeededForMonthWith(numberOfDays: 31, startingOn: 5) // 6
// But suppose it had 30 days?
rowsNeededForMonthWith(numberOfDays: 30, startingOn: 5) // 5
// Or suppose it had started on Thursday? (cf July 2021)
rowsNeededForMonthWith(numberOfDays: 31, startingOn: 4) // 5

最新更新