获取一个月的所有NSDate(以及相邻周的日期)

时间:2014-02-04 14:43:52

标签: ios calendar nsdate

给定一个日期(例如今天4 Feb 2014),我想获得一个NSDate个实例列表,其中Monday 27 Jan 2014Sunday 2 Mar 2014

基本上是当月的所有日期,加上上个月的最后一周的日期,以及下个月的第一周,如果他们与当月的某些日期共享同一周。< / p>

我怎样才能做到这一点?

enter image description here

我可以想到一种方法来获得这个(下面的伪代码),但它太长而复杂了。有没有更简单的方法,比如SDK提供给捷径的方法?

  1. 从[NSDate date](今天)
  2. 中提取月份组件
  3. 构建本月的第一天
  4. 计算其工作日
  5. 如果是星期三(本周的第3天),则将今天1,今天2添加到列表等等
  6. 从第2步开始重复,但是在该月的最后一天
  7. 对于那里的所有精英主义者,仅仅因为我没有发布任何代码,并不意味着这不是一个编码问题。问题是真实的(构建一个月的日历网格),并且在编码之前找到正确的算法/方法比使用NSDate和NSCalendar手动进行数学运算要好得多(非常容易出错,因为我需要考虑所有奇怪的情况)。我想很多人已经遇到过同样的问题,如果他们可以分享一些指针,那就太好了。如果您不想回答,则无需回复。

2 个答案:

答案 0 :(得分:2)

我要发布非常通用的代码。您需要根据自己的需要进行制作。

//Setup the calendar object
NSCalendar *calendar = [NSCalendar currentCalendar];

//Get the current date's month
NSUInteger month = [dateComponents month];

//Create an NSDate for the first and last day of the month
NSDateComponents *comp = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]];
[comp setDay:1];
NSDate *firstOfMonth = [calendar dateFromComponents:comp];
[comp setMonth:[comp month]+1];
[comp setDay:0];
NSDate *lastOfMonth = [calendar dateFromComponents:comp];

//Now get the first and last week number from there
NSUInteger unitFlags = NSWeekCalendarUnit;
//Create a date component object from today's date.
NSDateComponents *firstDateComponents = [calendar components:unitFlags
                                                   fromDate:firstOfMonth // for current date
                                                    options:0];
NSDateComponents *lastDateComponents = [calendar components:unitFlags
                                                   fromDate:lastOfMonth // for current date
                                                    options:0];


NSUInteger firstWeek = [firstDateComponents week];
NSUInteger lastWeek = [lastDateComponents week];

现在您已经有了第一周和最后一周,您可以在第一周的第一天开始,并通过上周的最后一天来设置您的日历。祝你好运。

答案 1 :(得分:0)

雨燕5:

extension Date {
    
    var startOfMonth: Date {
        
        let calendar = Calendar(identifier: .gregorian)
        let components = calendar.dateComponents([.year, .month], from: self)
        
        return  calendar.date(from: components)!
    }

    var endOfMonth: Date {
        var components = DateComponents()
        components.month = 1
        components.second = -1
        return Calendar(identifier: .gregorian).date(byAdding: components, to: startOfMonth)!
    }
}

let date = Date()

let firstWeek = Calendar.current.dateComponents([.weekOfYear], from: date.startOfMonth)
let lastWeek = Calendar.current.dateComponents([.weekOfYear], from: date.endOfMonth)