Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
Ios 在一个月内获得工作日_Ios_Swift_Nsdate_Weekday_Weekend - Fatal编程技术网

Ios 在一个月内获得工作日

Ios 在一个月内获得工作日,ios,swift,nsdate,weekday,weekend,Ios,Swift,Nsdate,Weekday,Weekend,我想在一个月内得到日期 我的计划是 获取给定月份的开始和结束日期 获取该范围内的所有日期 使用该方法迭代并消除周末内的日期 其余日期为工作日 因此,我创建了两个NSDate扩展方法来获取月份的开始日期和结束日期 extension NSDate { var startOfMonth: NSDate { let calendar = NSCalendar.currentCalendar() let components = calendar.componen

我想在一个月内得到日期

我的计划是

  • 获取给定月份的开始和结束日期
  • 获取该范围内的所有日期
  • 使用该方法迭代并消除周末内的日期
  • 其余日期为工作日

    因此,我创建了两个
    NSDate
    扩展方法来获取月份的开始日期和结束日期

    extension NSDate {
        var startOfMonth: NSDate {
            let calendar = NSCalendar.currentCalendar()
            let components = calendar.components([.Year, .Month], fromDate: self)
            return calendar.dateFromComponents(components)!
        }
    
        var endOfMonth: NSDate {
            let calendar = NSCalendar.currentCalendar()
            let components = NSDateComponents()
            components.month = 1
            return (calendar.dateByAddingComponents(components, toDate: self.startOfMonth, options: NSCalendarOptions())?.dateByAddingTimeInterval(-1))!
        }
    }
    
    现在我陷入了第二步。我找不到一种方法来获得给定开始日期和结束日期的日期范围

    有什么方法可以做到这一点吗?

    有了它的帮助,我就能够做到这一点

    let calendar = NSCalendar.currentCalendar()
    let normalizedStartDate = calendar.startOfDayForDate(NSDate().startOfMonth)
    let normalizedEndDate = calendar.startOfDayForDate(NSDate().endOfMonth)
    
    var dates = [normalizedStartDate]
    var currentDate = normalizedStartDate
    repeat {
        currentDate = calendar.dateByAddingUnit(NSCalendarUnit.Day, value: 1, toDate: currentDate, options: .MatchNextTime)!
        dates.append(currentDate)
    } while !calendar.isDate(currentDate, inSameDayAsDate: normalizedEndDate)
    
    let weekdays = dates.filter { !calendar.isDateInWeekend($0) }
    weekdays.forEach { date in
        print(NSDateFormatter.localizedStringFromDate(date, dateStyle: .FullStyle, timeStyle: .NoStyle))
    }
    
    而且它有效

    Monday, February 1, 2016
    Tuesday, February 2, 2016
    Wednesday, February 3, 2016
    Thursday, February 4, 2016
    Friday, February 5, 2016
    Monday, February 8, 2016
    Tuesday, February 9, 2016
    Wednesday, February 10, 2016
    Thursday, February 11, 2016
    Friday, February 12, 2016
    Monday, February 15, 2016
    Tuesday, February 16, 2016
    Wednesday, February 17, 2016
    Thursday, February 18, 2016
    Friday, February 19, 2016
    Monday, February 22, 2016
    Tuesday, February 23, 2016
    Wednesday, February 24, 2016
    Thursday, February 25, 2016
    Friday, February 26, 2016
    Monday, February 29, 2016
    
    • 获取当前日历

      let calendar = NSCalendar.currentCalendar()
      
    • 从当前日期中获取
      日期组件

      let components = calendar.components([.Year, .Month], fromDate: NSDate())
      
    • 获取每月第一天的日期

      let startOfMonth = calendar.dateFromComponents(components)!
      
    • 获取当前月份的天数

      let numberOfDays = calendar.rangeOfUnit(.Day, inUnit: .Month, forDate: startOfMonth).length
      
      let allDays = Array(0..<numberOfDays).map{ calendar.dateByAddingUnit(.Day, value: $0, toDate: startOfMonth, options: [])!}
      
    • 为当月的每一天创建一个
      NSDate
      实例数组

      let numberOfDays = calendar.rangeOfUnit(.Day, inUnit: .Month, forDate: startOfMonth).length
      
      let allDays = Array(0..<numberOfDays).map{ calendar.dateByAddingUnit(.Day, value: $0, toDate: startOfMonth, options: [])!}
      
    Swift 3:

    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month], from: Date())
    let startOfMonth = calendar.date(from:components)!
    let numberOfDays = calendar.range(of: .day, in: .month, for: startOfMonth)!.upperBound
    let allDays = Array(0..<numberOfDays).map{ calendar.date(byAdding:.day, value: $0, to: startOfMonth)!}
    let workDays = allDays.filter{ !calendar.isDateInWeekend($0) }
    
    let calendar=calendar.current
    让components=calendar.dateComponents([.year,.month],from:Date())
    让startOfMonth=calendar.date(from:components)!
    设numberOfDays=calendar.range(of:.天,in:.月,for:startOfMonth)!。上限
    
    让allDays=Array(0..要获得比上面给出的更一般的答案,您可以实现自己的
    SequenceType
    运行/生成
    NSDate
    元素

    从(Swift<2.0)修改
    SequenceType
    DateRange
    实现,我们可以构建以下内容:

    /* Modified version of Adam Preble:s DateRange: http://adampreble.net/blog/2014/09/iterating-over-range-of-dates-swift/ */
    func < (left: NSDate, right: NSDate) -> Bool {
        return left.compare(right) == NSComparisonResult.OrderedAscending
    }
    
    struct DateRange : SequenceType {
        var calendar: NSCalendar
        var startDate: NSDate
        var endDate: NSDate
        var stepUnits: NSCalendarUnit
        var stepValue: Int
    
        func generate() -> Generator {
            return Generator(range: self, firstDate: true)
        }
    
        struct Generator: GeneratorType {
            var range: DateRange
            var firstDate : Bool = true
    
            mutating func next() -> NSDate? {
                if firstDate {
                    firstDate = false
                    return range.startDate
                }
    
                guard let nextDate = range.calendar.dateByAddingUnit(range.stepUnits,
                    value: range.stepValue, toDate: range.startDate,
                    options: NSCalendarOptions.MatchFirst) where !(range.endDate < nextDate) else {
                        return nil
                }
    
                range.startDate = nextDate
                return nextDate
            }
        }
    }
    
    输出:

    /* Mon, Feb. 1, 2016
       Tue, Feb. 2, 2016
       Wed, Feb. 3, 2016
       Thu, Feb. 4, 2016
       Fri, Feb. 5, 2016
       Mon, Feb. 8, 2016
       Tue, Feb. 9, 2016
    
       ...
    
       Thu, Feb. 25, 2016
       Fri, Feb. 26, 2016
       Mon, Feb. 29, 2016 */
    
    /* Mon, Feb. 1, 2016
       Tue, Feb. 2, 2016
       Wed, Feb. 3, 2016
       Thu, Feb. 4, 2016
       Fri, Feb. 5, 2016
       Mon, Feb. 8, 2016
       Tue, Feb. 9, 2016
    
       ...
    
       Fri, Dec. 23, 2016
       Mon, Dec. 26, 2016
       Tue, Dec. 27, 2016
       Wed, Dec. 28, 2016
       Thu, Dec. 29, 2016
       Fri, Dec. 30, 2016
    
       // 2nd range print
       Fri, Jul. 1, 2016
       Mon, Jul. 4, 2016
       Tue, Jul. 5, 2016
       Wed, Jul. 6, 2016
       Thu, Jul. 7, 2016
    
       ...
    
       Fri, Jun. 23, 2017
       Mon, Jun. 26, 2017
       Tue, Jun. 27, 2017
       Wed, Jun. 28, 2017
       Thu, Jun. 29, 2017
       Fri, Jun. 30, 2017  */
    

    一个数组中一个月的日期(
    [NSDate]
    )可能不是问题,但是使用序列对于更大的日期跨度是很有价值的,而且当您需要多功能性时,w.r.t.会重新分配数组的大小和成员;特别是在一个数组中,您一次只能按顺序使用一个成员

    例如,在下面的示例中使用
    NSDate
    数组是非常不必要的(并且可能会产生不必要的开销;但让我们把它放在一边,因为我们希望避免一些评论者提出早熟优化的问题:))

    输出:

    /* Mon, Feb. 1, 2016
       Tue, Feb. 2, 2016
       Wed, Feb. 3, 2016
       Thu, Feb. 4, 2016
       Fri, Feb. 5, 2016
       Mon, Feb. 8, 2016
       Tue, Feb. 9, 2016
    
       ...
    
       Thu, Feb. 25, 2016
       Fri, Feb. 26, 2016
       Mon, Feb. 29, 2016 */
    
    /* Mon, Feb. 1, 2016
       Tue, Feb. 2, 2016
       Wed, Feb. 3, 2016
       Thu, Feb. 4, 2016
       Fri, Feb. 5, 2016
       Mon, Feb. 8, 2016
       Tue, Feb. 9, 2016
    
       ...
    
       Fri, Dec. 23, 2016
       Mon, Dec. 26, 2016
       Tue, Dec. 27, 2016
       Wed, Dec. 28, 2016
       Thu, Dec. 29, 2016
       Fri, Dec. 30, 2016
    
       // 2nd range print
       Fri, Jul. 1, 2016
       Mon, Jul. 4, 2016
       Tue, Jul. 5, 2016
       Wed, Jul. 6, 2016
       Thu, Jul. 7, 2016
    
       ...
    
       Fri, Jun. 23, 2017
       Mon, Jun. 26, 2017
       Tue, Jun. 27, 2017
       Wed, Jun. 28, 2017
       Thu, Jun. 29, 2017
       Fri, Jun. 30, 2017  */