看了一些关于SO的不同建议后,我不能确定为什么下面的函数不起作用。它似乎对一些月份返回6,对另一些月份返回5。当把星期改为日子时,它工作得很好。
例如,尝试
weeksInMonth(8, forYear 2015)
结果6.
我相信我对日历上的“第一个工作日”属性有一个错误的理解,但还没有找到苹果或网上的充分解释。
已尝试了.WeekOfMonth 和.WeekOfYear。同样无法找到确切差异的解释。
任何建议都是非常受欢迎的。
func weeksInMonth(month: Int, forYear year: Int) -> Int?
{
if (month < 1 || month > 12) { return nil }
let dateString = String(format: "%4d/%d/01", year, month)
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd"
if let date = dateFormatter.dateFromString(dateString),
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
{
calendar.firstWeekday = 2 // Monday
let weekRange = calendar.rangeOfUnit(.WeekOfMonth, inUnit: .Month, forDate: date)
let weeksCount = weekRange.length
return weeksCount
}
else
{
return nil
}
}
更新日期:
抱歉,我的问题不清楚。我正在计算一个月中有多少周包含星期一。对于八月,应该是5周。
5条答案
按热度按时间hpxqektj1#
您的代码计算一个月中出现的周数(完整或部分)。您显然需要的是给定月份中的星期一数。使用
NSDateComponents
,特别是weekdayOrdinal
属性,您可以计算一个月中的第一个(weekdayOrdinal=1
)和最后一个(weekdayOrdinal=-1
)星期一。然后计算周数差(并加一)。Swift 2中可能的实现:
weekdayOrdinal
从月末开始倒计数。在Determine NSDate for Memorial Day in a given year中观察到了这一点,并由Dave DeLong确认)。Swift 3的更新:
b0zn9rqh2#
其实你的问题是:一个月有多少个星期一?
我的方法是计算一个月的第一个星期一,这可以通过将CalendarUnit
WeekdayOrdinal
设置为1来完成。然后获得总天数并进行一些计算。雨燕1.2
雨燕2号
gmol16393#
雨燕2
下面的代码计算一个月中的周数。它不依赖于该月的开始或结束日期。
dddzy1tm4#
雨燕4+:
jk9hmnmh5#
斯威夫特4+:
根据组件生成日期:
从以下日期检测周数: