2017-06-17 48 views

回答

3

A DateComponents有一个weekday属性,表示星期几。平日(在基金会的公历中)周日编号为1,周一为2,...,周六为7。

一个DateComponents也有weekdayOrdinal属性,代表“the position of the weekday within the next larger calendar unit, such as the month. For example, 2 is the weekday ordinal unit for the second Friday of the month.

让我们初始化DateComponents一些星期六六月2017年它通常是一个好主意,以指定中午的时间,如果你不关心时间,因为midnight (the default time of day) can cause problems in some time zones on some days

var components = DateComponents(era: 1, year: 2017, month: 06, hour: 12, weekday: 7) 

然后让我们制作一个日历。

var calendar = Calendar.autoupdatingCurrent 

现在我们可以遍历所有可能的周日序数。对于每一个,我们都会要求日历生成一个日期。然后我们要求日历将日期转换回年,月,日组件。

在公历中,有些月份有5个星期六,但大多数有4个。所以当我们要求第5个星期六时,我们可能会在下个月得到一个日期。当发生这种情况时,我们想压制那个日期。

for i in 1 ... 5 { 
    components.weekdayOrdinal = i 
    let date = calendar.date(from: components)! 
    let ymd = calendar.dateComponents([.year, .month, .day], from: date) 
    guard ymd.month == components.month else { break } 
    print("\(ymd.year!)-\(ymd.month!)-\(ymd.day!)") 
} 

输出:

2017-6-3 
2017-6-10 
2017-6-17 
2017-6-24 

Objective-C的版本:

NSDateComponents *components = [NSDateComponents new]; 
components.era = 1; 
components.year = 2017; 
components.month = 6; 
components.hour = 12; 
components.weekday = 7; 
NSCalendar *calendar = NSCalendar.autoupdatingCurrentCalendar; 

for (NSInteger i = 1; i <= 5; ++i) { 
    components.weekdayOrdinal = i; 
    NSDate *date = [calendar dateFromComponents:components]; 
    NSDateComponents *ymd = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date]; 
    if (ymd.month != components.month) { break; } 
    NSLog(@"%ld-%ld-%ld", (long)ymd.year, (long)ymd.month, (long)ymd.day); 
} 
0

这是使用calendar方法称为enumerateDates和使用Date扩展

//month in MM format, year in yyyy format and dayNumber as Int 1 for sunday, 7 for saturday 
    func datesWith(dayNumber:Int,month:String,year:String) -> [Date] 
    { 
     assert(dayNumber >= 1 && dayNumber <= 7, "Day number is wrong") 

     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "yyyy-MM-dd" 
     let date = dateFormatter.date(from: year + "-" + month + "-" + "01") 

     guard date != nil else { 
      return [] 
     } 
     var resultDates : [Date] = [] 

     //check if firstDay of month is desired weekday 
     if(Calendar.current.component(.weekday, from: date!) == dayNumber) 
     { 
      resultDates.append(date!) 
     } 

     Calendar.current.enumerateDates(startingAfter: date!, matching: DateComponents(weekday: dayNumber), matchingPolicy: Calendar.MatchingPolicy.nextTimePreservingSmallerComponents) { (currentDate, result, stop) in 
      if(currentDate! > date!.endOfMonth()) 
      { 
       stop = true 
       return 
      } 
      resultDates.append(currentDate!) 
     } 

     return resultDates 
    } 
你的问题的另一个解决方案

扩展

extension Date { 
    func startOfMonth() -> Date { 
     return Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))! 
    } 

    func endOfMonth() -> Date { 
     return Calendar.current.date(byAdding: DateComponents(month: 1, day: -1), to: self.startOfMonth())! 
    } 
} 

使用它

override func viewDidLoad() { 
    super.viewDidLoad() 

    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd" 
    // Do any additional setup after loading the view, typically from a nib. 
    let datesArray = self.datesWith(dayNumber: 5, month: "06", year: "2017") 
    for currDate in datesArray { 
     debugPrint(dateFormatter.string(from: currDate)) 
    } 
} 

输出

"2017-06-01" 
"2017-06-08" 
"2017-06-15" 
"2017-06-22" 
"2017-06-29" 

希望这会有帮助

相关问题