我正在尝试计算一个月中一周中的每一天有多少天。我已将以下问题/答案用作我要达到的目标的基础,并且在大多数情况下都有效。
how can we get the number of sundays on an given month ? ( swift )
不幸的是,如果是工作日,它还会计算下个月的第一天。
我对代码的计算方式不太熟悉,无法理解我是否可以在每月的总天数中添加-1或其他内容。
如果有人可以推荐解决方案,将不胜感激。
我曾尝试将“ numberOfSundays + = 1”更改为“ numberOfSundays + = 0”,因为我认为这可能是导致问题的原因。
func getNumberOfDaysInMonth (month : Int, Year : Int, nameOfDay: String) -> Int? {
var dateComponents = DateComponents()
dateComponents.year = Year
dateComponents.month = month
let calendar = NSCalendar.current
let date = calendar.date(from: dateComponents)
guard let range = calendar.range(of: .day, in: .month, for: date!) else { return nil }
let numDays = range.endIndex
// New code starts here:
var numberOfSundays = 0
let dateFormatter = DateFormatter()
for day in 1...numDays {
dateComponents.day = day
guard let date = calendar.date(from: dateComponents) else { return nil }
dateFormatter.dateFormat = "EEEE"
let dayOfWeek = dateFormatter.string(from: date) // Get day of week
if dayOfWeek == nameOfDay { // Check if it's a Monday
numberOfSundays += 1
}
}
return numberOfSundays
}
getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Monday")
getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Tuesday")
getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Wednesday")
getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Thursday")
getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Friday")
在我将函数称为“ getNumberOfDaysInMonth(month:06,Year:2019,nameOfDay:“ Monday”)“的情况下,它返回5作为2019年6月的天数,实际上是4。
答案 0 :(得分:0)
func getNumberOfDaysInMonth(month: Int , year: Int, nameOfDay: String) -> Int? {
var components = DateComponents()
components.year = year
components.month = month
let calendar = Calendar.current
guard let date = calendar.date(from: components),
let range = calendar.range(of: .day, in: .month, for: date) else { return nil }
return range
.map { DateComponents(year: year, month: month, day: $0) }
.map { calendar.date(from: $0) }
.compactMap { date -> String? in
guard let date = date else { return nil }
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE"
return dateFormatter.string(from: date)
}
.filter { $0 == nameOfDay }
.count
}
答案 1 :(得分:0)
在Range
的文档中很难找到,但是.endIndex
属性的文档注释为:
集合的“过去”位置,即位置比最后一个有效的下标参数大一个。
无论如何,您不应该使用索引来计算大小。 正确地,您应该使用:
let numDays = range.upperBound - range.lowerBound
或者简单地
let numDays = range.count
正确计算天数。