如何基于给定的NSDate生成方便的日期范围? [英] How can I generate convenient date ranges based on a given NSDate?
问题描述
我在Cocoa中创建了一个报表生成器,我需要生成方便的日期范围,例如今天,本周,本月,今年等。
有没有好的方法来做到这一点?这是我的骨架到目前为止:
@interface DateRange:NSObject
{
NSDate startDate;
NSDate endDate;
}
@property(nonatomic,retain)NSDate * startDate;
@property(nonatomic,retain)NSDate * endDate;
+(DateRange *)rangeForDayContainingDate:(NSDate *)date;
+(DateRange *)rangeForWeekContainingDate:(NSDate *)date;
+(DateRange *)rangeForMonthContainingDate:(NSDate *)date;
+(DateRange *)rangeForYearContainingDate:(NSDate *)date;
@end
一些示例用例如下: p>
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:[NSDate date]];
DateRange * thisYear = [DateRange rangeForYearContainingDate:[NSDate date]];
基本上,我想要返回的 DateRange
对象以包含围绕目标日期的周,月或年的开始和结束日期。例如(以伪代码):
NSDate * today = [2009年8月25日]
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:today];
assert(thisWeek.startDate == [August 23,3009]);
assert(thisWeek.endDate == [August 29,3009]);
更新:
我能够通过由Kendall Helmstetter Geln提供的答案。以下是一周范围的完整方法:
+(DateRange *)rangeForWeekContainingDate:(NSDate *)date
{
DateRange * range = [[self alloc] init];
//星期开始
NSDate * firstDay;
[[self calendar] rangeOfUnit:NSWeekCalendarUnit
startDate:& firstDay
interval:0
forDate:date];
[range setStartDate:firstDay];
//周末结束
NSDateComponents * oneWeek = [[NSDateComponents alloc] init];
[oneWeek setWeek:1];
[range setEndDate:[[self calendar] dateByAddingComponents:oneWeek
toDate:firstDay
options:0]];
[oneWeek release];
return [range autorelease];
}
解决方案,只需要计算一天中的秒数:
60秒* 60分钟* 24小时= 1天。
然后在
rangeForDayContainingDate
方法中,您可以提取日期组件,获取当前日期,基于设置小时和分钟的日期创建新日期到0:00,并创建结束日期,添加上面计算的时间间隔。I'm creating a report generator in Cocoa, and I need to produce convenient date ranges such as "Today", "This Week", "This Month", "This Year", etc.
Is there a good way to do this? Here is my skeleton thus far:
@interface DateRange : NSObject { NSDate startDate; NSDate endDate; } @property (nonatomic, retain) NSDate * startDate; @property (nonatomic, retain) NSDate * endDate; + (DateRange *)rangeForDayContainingDate:(NSDate *)date; + (DateRange *)rangeForWeekContainingDate:(NSDate *)date; + (DateRange *)rangeForMonthContainingDate:(NSDate *)date; + (DateRange *)rangeForYearContainingDate:(NSDate *)date; @end
Some example use cases would be as follows:
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:[NSDate date]]; DateRange * thisYear = [DateRange rangeForYearContainingDate:[NSDate date]];
Essentially, I want the returned
DateRange
object to contain the start and end dates for the week, month or year surrounding the target date. For example (in pseudocode):NSDate * today = [August 25, 2009]; DateRange * thisWeek = [DateRange rangeForWeekContainingDate:today]; assert(thisWeek.startDate == [August 23, 3009]); assert(thisWeek.endDate == [August 29, 3009]);
update:
I was able to get this working thanks to the answer provided by Kendall Helmstetter Geln. Here is the complete method for a one-week range:
+ (DateRange *)rangeForWeekContainingDate:(NSDate *)date { DateRange * range = [[self alloc] init]; // start of the week NSDate * firstDay; [[self calendar] rangeOfUnit:NSWeekCalendarUnit startDate:&firstDay interval:0 forDate:date]; [range setStartDate:firstDay]; // end of the week NSDateComponents * oneWeek = [[NSDateComponents alloc] init]; [oneWeek setWeek:1]; [range setEndDate:[[self calendar] dateByAddingComponents:oneWeek toDate:firstDay options:0]]; [oneWeek release]; return [range autorelease]; }
解决方案Well since timeInterval is in seconds, just do the math to figure out how many seconds are in a day:
60 seconds * 60 minutes * 24 hours = 1 day.
Then in your
rangeForDayContainingDate
method you could extract date components, get the current day, create a new date based on the day with hours and minutes set to 0:00, and the create the end date adding the time interval as calculated above.这篇关于如何基于给定的NSDate生成方便的日期范围?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!