Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算给定月份的周数-Swift_Swift_Swift2 - Fatal编程技术网

计算给定月份的周数-Swift

计算给定月份的周数-Swift,swift,swift2,Swift,Swift2,在查看了一些不同的建议之后,我无法确定为什么下面的函数不起作用。它似乎在某些月份返回6个,在其他月份返回5个。当一周换一天时,它工作得很好 例如,尝试 weeksInMonth(8, forYear 2015) 结果6 我相信我对日历上的“firstWeekday”属性有一个错误的理解,但苹果或在线并没有找到充分的解释 两种方法都试过了。一周一个月,一周一年。再次找不到确切差异的解释 欢迎提出任何建议 func weeksInMonth(month: Int, forYear year: I

在查看了一些不同的建议之后,我无法确定为什么下面的函数不起作用。它似乎在某些月份返回6个,在其他月份返回5个。当一周换一天时,它工作得很好

例如,尝试

weeksInMonth(8, forYear 2015) 
结果6

我相信我对日历上的“firstWeekday”属性有一个错误的理解,但苹果或在线并没有找到充分的解释

两种方法都试过了。一周一个月,一周一年。再次找不到确切差异的解释

欢迎提出任何建议

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
    }
}
func weeksInMonth(月:Int,年:Int)->Int?
{
如果(月<1 | |月>12){返回零}
let dateString=String(格式:“%4d/%d/01”,年,月)
让dateFormatter=NSDateFormatter()
dateFormatter.dateFormat=“yyyy/MM/dd”
如果let date=dateFormatter.dateFromString(dateString),
让calendar=NSCalendar(calendarIdentifier:NSCalendarIdentifierGregorian)
{
calendar.firstWeekday=2//星期一
让weekRange=calendar.rangeOfUnit(.WeekOfMonth,inUnit:.Month,forDate:date)
让weeksCount=weekRange.length
返回周数
}
其他的
{
归零
}
}
更新:

func numberOfMondaysInMonth(month: Int, forYear year: Int) -> Int?
{
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    calendar.firstWeekday = 2 // 2 == Monday

    // First monday in month:
    let comps = NSDateComponents()
    comps.month = month
    comps.year = year
    comps.weekday = calendar.firstWeekday
    comps.weekdayOrdinal = 1
    guard let first = calendar.dateFromComponents(comps)  else {
        return nil
    }

    // Last monday in month:
    comps.weekdayOrdinal = -1
    guard let last = calendar.dateFromComponents(comps)  else {
        return nil
    }

    // Difference in weeks:
    let weeks = calendar.components(.WeekOfMonth, fromDate: first, toDate: last, options: [])
    return weeks.weekOfMonth + 1
}
func numberOfMondaysInMonth(_ month: Int, forYear year: Int) -> Int? {
    var calendar = Calendar(identifier: .gregorian)
    calendar.firstWeekday = 2 // 2 == Monday

    // First monday in month:
    var comps = DateComponents(year: year, month: month,
                               weekday: calendar.firstWeekday, weekdayOrdinal: 1)
    guard let first = calendar.date(from: comps)  else {
        return nil
    }

    // Last monday in month:
    comps.weekdayOrdinal = -1
    guard let last = calendar.date(from: comps)  else {
        return nil
    }

    // Difference in weeks:
    let weeks = calendar.dateComponents([.weekOfMonth], from: first, to: last)
    return weeks.weekOfMonth! + 1
}

对不起,我的问题不清楚。我试图计算出一个月有多少周包括一个星期一。对于8月份,这应该是5周。

您的代码计算发生的周数(完整或部分) 一个月后。你显然想要的是星期一的数量 在给定的月份。使用
NSDateComponents
,尤其是使用
weekdayOrdinal
属性可以计算第一个 (
weekdayOrdinal=1
)和最后一个(
weekdayOrdinal=-1
)周一 一个月后。然后以周为单位计算差异(并加上一周)

Swift 2:

func numberOfMondaysInMonth(month: Int, forYear year: Int) -> Int?
{
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    calendar.firstWeekday = 2 // 2 == Monday

    // First monday in month:
    let comps = NSDateComponents()
    comps.month = month
    comps.year = year
    comps.weekday = calendar.firstWeekday
    comps.weekdayOrdinal = 1
    guard let first = calendar.dateFromComponents(comps)  else {
        return nil
    }

    // Last monday in month:
    comps.weekdayOrdinal = -1
    guard let last = calendar.dateFromComponents(comps)  else {
        return nil
    }

    // Difference in weeks:
    let weeks = calendar.components(.WeekOfMonth, fromDate: first, toDate: last, options: [])
    return weeks.weekOfMonth + 1
}
func numberOfMondaysInMonth(_ month: Int, forYear year: Int) -> Int? {
    var calendar = Calendar(identifier: .gregorian)
    calendar.firstWeekday = 2 // 2 == Monday

    // First monday in month:
    var comps = DateComponents(year: year, month: month,
                               weekday: calendar.firstWeekday, weekdayOrdinal: 1)
    guard let first = calendar.date(from: comps)  else {
        return nil
    }

    // Last monday in month:
    comps.weekdayOrdinal = -1
    guard let last = calendar.date(from: comps)  else {
        return nil
    }

    // Difference in weeks:
    let weeks = calendar.dateComponents([.weekOfMonth], from: first, to: last)
    return weeks.weekOfMonth! + 1
}
注意:从月底开始倒数的
weekdayOrdinal
负数在文档中并不明显。这是在中国观察到的 及)


更新Swift 3:

func numberOfMondaysInMonth(month: Int, forYear year: Int) -> Int?
{
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    calendar.firstWeekday = 2 // 2 == Monday

    // First monday in month:
    let comps = NSDateComponents()
    comps.month = month
    comps.year = year
    comps.weekday = calendar.firstWeekday
    comps.weekdayOrdinal = 1
    guard let first = calendar.dateFromComponents(comps)  else {
        return nil
    }

    // Last monday in month:
    comps.weekdayOrdinal = -1
    guard let last = calendar.dateFromComponents(comps)  else {
        return nil
    }

    // Difference in weeks:
    let weeks = calendar.components(.WeekOfMonth, fromDate: first, toDate: last, options: [])
    return weeks.weekOfMonth + 1
}
func numberOfMondaysInMonth(_ month: Int, forYear year: Int) -> Int? {
    var calendar = Calendar(identifier: .gregorian)
    calendar.firstWeekday = 2 // 2 == Monday

    // First monday in month:
    var comps = DateComponents(year: year, month: month,
                               weekday: calendar.firstWeekday, weekdayOrdinal: 1)
    guard let first = calendar.date(from: comps)  else {
        return nil
    }

    // Last monday in month:
    comps.weekdayOrdinal = -1
    guard let last = calendar.date(from: comps)  else {
        return nil
    }

    // Difference in weeks:
    let weeks = calendar.dateComponents([.weekOfMonth], from: first, to: last)
    return weeks.weekOfMonth! + 1
}

实际上你的问题是:一个月有多少个星期一

我的方法是计算当月的第一个星期一,这可以通过将CalendarUnit
WeekdayOrdinal
设置为1来实现。然后算出总天数并做一些数学运算

Swift 1.2 斯威夫特2
Swift 2

以下代码计算一个月的周数。这并不取决于一个月的开始或结束日期

func weeksInMonth(month: Int, year: Int) -> (Int)? {

  let calendar = NSCalendar.currentCalendar()

  let comps = NSDateComponents()
  comps.month = month+1
  comps.year = year
  comps.day = 0

  guard let last = calendar.dateFromComponents(comps) else {
    return nil
  }
  // Note: Could get other options as well
  let tag = calendar.components([.WeekOfMonth,.WeekOfYear,
       .YearForWeekOfYear,.Weekday,.Quarter],fromDate: last)

  return tag.weekOfMonth

}

// Example Usage:

if let numWeeks = weeksInMonth(8,year: 2015) {
  print(numWeeks) // Prints 6
}

if let numWeeks = weeksInMonth(12,year: 2015) {
  print(numWeeks) // Prints 5
}
Swift 4+: Swift 4+:

从组件生成日期:

let dateComponents = DateComponents.init(year: 2019, month: 5)
let monthCurrentDayFirst = Calendar.current.date(from: dateComponents)!
let monthNextDayFirst = Calendar.current.date(byAdding: .month, value: 1, to: monthCurrentDayFirst)!
let monthCurrentDayLast = Calendar.current.date(byAdding: .day, value: -1, to: monthNextDayFirst)!
从日期检测周数:

let numberOfWeeks = Calendar.current.component(.weekOfMonth, from: monthCurrentDayLast)

2015年8月有六个不同的星期,所以结果是正确的,不是吗?是的。我是说,不,嗯。。。大概我很抱歉。。。你的问题是什么?抱歉,我已经用我的真实问题更新了这个问题。4个小时什么都没有,然后在10秒内有2个答案:):-)我喜欢你计算月的最后一个工作日的方法。上面的代码:weeksInMonth(12,forYear:2015)==4,但是,2015年12月有5个星期。@MikeChirico:确切的问题是“我试图计算出一个月有多少周包括一个星期一。对于8月,这应该是5。”–2015年12月有4个星期一,因此这是此处要求的结果。正确。”给定一个月中有多少周包括星期一“,这是一个更好的答案。这个例子很有启发性。@MikeChirico:这个问题最初不清楚,后来在更新中得到澄清。为了避免误解,我重新命名了该函数。谢谢您的反馈!