如何基于给定的NSDate生成方便的日期范围? [英] How can I generate convenient date ranges based on a given NSDate?

查看:115
本文介绍了如何基于给定的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆