![](/img/trans.png)
[英]Get All Weeks with start date and end date of given month (NSDate Objective C)
[英]Get all NSDate of a month (and the dates in adjacent weeks)
给定一个日期(例如今天4 Feb 2014
),我想获取从Monday 27 Jan 2014
到Sunday 2 Mar 2014
的NSDate
实例列表。
基本上是当月的所有日期,加上上个月最后一周和下个月第一周的日期,如果它们与当月的某些日期共享同一周。
我怎样才能做到这一点?
我可以想出一种方法来获得这个(下面的伪代码),但它太长太复杂了。 有没有更简单的方法,比如SDK提供的快捷方式?
同样对于那里的所有精英,仅仅因为我没有发布任何代码,并不意味着这不是一个编码问题。 问题是真实的(构建一个月的日历网格),并且在编码之前找到正确的算法/方法比使用 NSDate 和 NSCalendar 手动进行数学运算要好得多(非常容易出错,因为我需要考虑考虑所有奇怪的情况)。 我想很多人已经遇到过同样的问题,如果他们能分享一些建议,那就太好了。 如果您不想回答,则无需回复。
我将发布非常通用的代码。 您将需要使其特定于您的需求。
//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];
现在您有了第一周和最后一周,您可以从第一周的第一天开始,并通过最后一周的最后一天来设置日历。 祝你好运。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.