给定一个日期(例如今天4 Feb 2014
),我想获得一个NSDate
个实例列表,其中Monday 27 Jan 2014
到Sunday 2 Mar 2014
。
基本上是当月的所有日期,加上上个月的最后一周的日期,以及下个月的第一周,如果他们与当月的某些日期共享同一周。< / p>
我怎样才能做到这一点?
我可以想到一种方法来获得这个(下面的伪代码),但它太长而复杂了。有没有更简单的方法,比如SDK提供给捷径的方法?
对于那里的所有精英主义者,仅仅因为我没有发布任何代码,并不意味着这不是一个编码问题。问题是真实的(构建一个月的日历网格),并且在编码之前找到正确的算法/方法比使用NSDate和NSCalendar手动进行数学运算要好得多(非常容易出错,因为我需要考虑所有奇怪的情况)。我想很多人已经遇到过同样的问题,如果他们可以分享一些指针,那就太好了。如果您不想回答,则无需回复。
答案 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)
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)