【问题标题】:How to get All the sundays in Array of date ios如何获取日期数组中的所有星期日
【发布时间】:2015-09-11 07:03:13
【问题描述】:

我只想要一个以 NSDate 的形式包含一年中所有星期一的数组,但速度很快。 我在目标 -c 中使用以下代码,但不知道如何快速使用它。

 NSDate *pickerDate = [NSDate date];
    NSLog(@"pickerDate: %@", pickerDate);

    NSDateComponents *dateComponents;
    NSCalendar *calendar = [NSCalendar currentCalendar];

    dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate];
    NSInteger firstMondayOrdinal = 9 - [dateComponents weekday];
    dateComponents = [[NSDateComponents alloc] init];
    [dateComponents setDay:firstMondayOrdinal];
    NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0];

    dateComponents = [[NSDateComponents alloc] init];
    [dateComponents setWeek:1];

    for (int i=0; i<64; i++) {
        [dateComponents setWeek:i];
        NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0];
        NSLog(@"week#: %i, mondayDate: %@", i, mondayDate);
    }

【问题讨论】:

  • 这段代码的某个特定部分是否存在翻译问题?
  • 是的,我只是想转换这段代码,这样我就可以在一个数组中获取所有星期日

标签: ios arrays swift nsdate nscalendar


【解决方案1】:

Xcode 8 或更高版本 • Swift 3 或更高版本

extension Calendar {
    static let gregorian = Calendar(identifier: .gregorian)
}

extension Date {
    var startOfWeek: Date {
        return Calendar.gregorian.date(from: Calendar.gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
    }
    var addingOneWeek: Date {
        return Calendar.gregorian.date(byAdding: DateComponents(weekOfYear: 1), to: self)!
    }
    var nextSunday: Date {
        return startOfWeek.addingOneWeek
    }
    func nextFollowingSundays(_ limit: Int) -> [Date] {
        precondition(limit > 0)
        var sundays = [nextSunday]
        sundays.reserveCapacity(limit)
        return [nextSunday] + (0..<limit-1).compactMap { _ in
            guard let next = sundays.last?.addingOneWeek else { return nil }
            sundays.append(next)
            return next
        }
    }
}

用法:

let today = Date()
let nextFollowingSundays = today.nextFollowingSundays(52)
nextFollowingSundays.forEach { sunday in
    print(sunday.description(with: .current), terminator: "\n")
}
// ["Feb 17, 2019 at 12:00 AM", "Feb 24, 2019 at 12:00 AM", "Mar 3, 2019 at 12:00 AM", "Mar 10, 2019 at 12:00 AM", "Mar 17, 2019 at 12:00 AM", "Mar 24, 2019 at 12:00 AM", "Mar 31, 2019 at 12:00 AM", "Apr 7, 2019 at 12:00 AM", "Apr 14, 2019 at 12:00 AM", "Apr 21, 2019 at 12:00 AM", "Apr 28, 2019 at 12:00 AM", "May 5, 2019 at 12:00 AM", "May 12, 2019 at 12:00 AM", "May 19, 2019 at 12:00 AM", "May 26, 2019 at 12:00 AM", "Jun 2, 2019 at 12:00 AM", "Jun 9, 2019 at 12:00 AM", "Jun 16, 2019 at 12:00 AM", "Jun 23, 2019 at 12:00 AM", "Jun 30, 2019 at 12:00 AM", "Jul 7, 2019 at 12:00 AM", "Jul 14, 2019 at 12:00 AM", "Jul 21, 2019 at 12:00 AM", "Jul 28, 2019 at 12:00 AM", "Aug 4, 2019 at 12:00 AM", "Aug 11, 2019 at 12:00 AM", "Aug 18, 2019 at 12:00 AM", "Aug 25, 2019 at 12:00 AM", "Sep 1, 2019 at 12:00 AM", "Sep 8, 2019 at 12:00 AM", "Sep 15, 2019 at 12:00 AM", "Sep 22, 2019 at 12:00 AM", "Sep 29, 2019 at 12:00 AM", "Oct 6, 2019 at 12:00 AM", "Oct 13, 2019 at 12:00 AM", "Oct 20, 2019 at 12:00 AM", "Oct 27, 2019 at 12:00 AM", "Nov 3, 2019 at 1:00 AM", "Nov 10, 2019 at 1:00 AM", "Nov 17, 2019 at 12:00 AM", "Nov 24, 2019 at 12:00 AM", "Dec 1, 2019 at 12:00 AM", "Dec 8, 2019 at 12:00 AM", "Dec 15, 2019 at 12:00 AM", "Dec 22, 2019 at 12:00 AM", "Dec 29, 2019 at 12:00 AM", "Jan 5, 2020 at 12:00 AM", "Jan 12, 2020 at 12:00 AM", "Jan 19, 2020 at 12:00 AM", "Jan 26, 2020 at 12:00 AM", "Feb 2, 2020 at 12:00 AM", "Feb 9, 2020 at 12:00 AM", "Feb 16, 2020 at 12:00 AM"]

【讨论】:

    【解决方案2】:

    给你,

    var pickerDate = NSDate()
    println(pickerDate)
    
    var dateComponents: NSDateComponents? = nil
    var calendar = NSCalendar.currentCalendar()
    
    dateComponents = calendar.components(NSCalendarUnit.CalendarUnitWeekday, fromDate: pickerDate)
    var firstMondayOrdinal = 9 - dateComponents!.weekday
    dateComponents =  NSDateComponents()
    dateComponents!.day = firstMondayOrdinal
    var firstMondayDate = calendar.dateByAddingComponents(dateComponents!, toDate: pickerDate, options: NSCalendarOptions(0))
    
    dateComponents = NSDateComponents()
    dateComponents?.weekdayOrdinal = 1
    
    for (var i=0; i<64; i++){
        dateComponents?.weekdayOrdinal = i
        var mondayDate = calendar.dateByAddingComponents(dateComponents!, toDate: firstMondayDate!, options: NSCalendarOptions.MatchFirst)
         println("\(i)" + "\(mondayDate!)");
    }
    

    【讨论】:

    • 那么,请接受我的回答 :)(勾选显示在提供的答案左上角的复选标记)
    【解决方案3】:

    CalendarenumerateDates(startingAfter:matching:matchingPolicy:)有一个被低估但非常方便的方法

    // Create the date component matching the weekday (Sunday = 1)
    let mondayComponent = DateComponents(weekday: 2)
    
    // Calculate Jan 1st of the current date
    let calendar = Calendar.current
    let currentDate = Date()
    var startOfYear = currentDate
    var interval : TimeInterval = 0.0
    _ = calendar.dateInterval(of:.year, start: &startOfYear, interval: &interval, for: currentDate)
    
    // Get the current year as integer
    let thisYear = calendar.component(.year, from: startOfYear)
    
    // Create an array for the result
    var allMondays = [Date]()
    
    // If Jan 1st is a Monday append it to the array
    if calendar.component(.weekday, from: startOfYear) == 2 { allMondays.append(startOfYear) }
    
    // Now enumerate all dates matching the weekday component within this year
    // If the year reaches thisYear + 1 the block will be exited.    
    calendar.enumerateDates(startingAfter: startOfYear, matching: mondayComponent, matchingPolicy: .nextTime) { (date, strict, stop) in
        guard let date = date else { return }
        if calendar.component(.year, from: date) > thisYear {
            stop = true
        } else {
            allMondays.append(date)
        }
    }
    

    【讨论】:

      【解决方案4】:

      给你。这很简单,但是有一些陷阱,特别是NSCalendarOptions 的选项集,dateByAddingComponents 返回一个可选的事实,NSCalendarUnit 的枚举名称的更改以及NSDateComponents.week 的弃用,但除此之外它很简单。我没有检查逻辑...

      //NSDate *pickerDate = [NSDate date];
      let pickerDate = NSDate() /* I just used today for playground */
      
      //NSLog(@"pickerDate: %@", pickerDate);
      print("pickerDate: \(pickerDate)")
      
      //NSDateComponents *dateComponents;
      var dateComponents: NSDateComponents /* var because you keep reallocating it */
      
      //NSCalendar *calendar = [NSCalendar currentCalendar];
      let calendar = NSCalendar.currentCalendar()
      
      //dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate];
      dateComponents = calendar.components(NSCalendarUnit.Weekday, fromDate: pickerDate)
      
      //NSInteger firstMondayOrdinal = 9 - [dateComponents weekday];
      let firstMondayOrdinal = 9 - dateComponents.weekday
      
      //dateComponents = [[NSDateComponents alloc] init];
      dateComponents = NSDateComponents()
      
      //[dateComponents setDay:firstMondayOrdinal];
      dateComponents.day = firstMondayOrdinal
      
      //NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0];
      if let firstMondayDate = calendar.dateByAddingComponents(dateComponents, toDate: pickerDate, options: NSCalendarOptions(rawValue: 0)) {
          /* this returns an optional so test for it */
      
          //dateComponents = [[NSDateComponents alloc] init];
          dateComponents = NSDateComponents()
      
          //[dateComponents setWeek:1]; /* week deprecated */
          dateComponents.weekOfYear = 1 /* this line is redundant, re-done inside for */
      
          //for (int i=0; i<64; i++) {
          for i in 0 ..< 64 {
              //[dateComponents setWeek:i];
              dateComponents.weekOfYear = i
              //    NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0];
              let mondayDate = calendar.dateByAddingComponents(dateComponents, toDate: firstMondayDate, options: NSCalendarOptions(rawValue: 0))
              /* no need to test for nil if just printing it, but beware */
      
              //NSLog(@"week#: %i, mondayDate: %@", i, mondayDate);
              print("week#: \(i), mondayDate: \(mondayDate)")
          }
      }
      

      【讨论】:

        【解决方案5】:

        这里我只是自定义了上面的代码来获得不同的周日数

        这是从你的约会开始到下周日的延期

         extension Calendar {
                    static let gregorian = Calendar(identifier: .gregorian)
                }
        
                extension Date {
                    var startOfWeek: Date {
                        return Calendar.gregorian.date(from: Calendar.gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
                    }
                    var nextSunday: Date {
                        return Calendar.gregorian.date(byAdding: DateComponents(weekOfYear: 1), to: startOfWeek)!
                    }
                }
        
        
        //Write this logic in your custom function
        
         @objc func getNext100Sundsays(){
                let firstSunday = date?.nextSunday
                var result = [firstSunday]
                var displayResult = [String]()
                (1...1000).forEach  { _ in
                    guard let nextSunday = result.last??.nextSunday else { return }
                    let stringDispayDate = displayDateFormatter.string(from: nextSunday)
                    result.append(nextSunday)
                    displayResult.append(stringDispayDate)
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2017-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多