Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何根据给定的日期生成方便的日期范围?_Cocoa_Nsdate - Fatal编程技术网

Cocoa 如何根据给定的日期生成方便的日期范围?

Cocoa 如何根据给定的日期生成方便的日期范围?,cocoa,nsdate,Cocoa,Nsdate,我正在用Cocoa创建一个报告生成器,我需要生成方便的日期范围,如“今天”、“本周”、“本月”、“今年”等 有什么好办法吗?以下是我迄今为止的骨架: @interface DateRange : NSObject { NSDate startDate; NSDate endDate; } @property (nonatomic, retain) NSDate * startDate; @property (nonatomic, retain) NSDate * endDate

我正在用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
一些示例用例如下所示:

DateRange * thisWeek = [DateRange rangeForWeekContainingDate:[NSDate date]];
DateRange * thisYear = [DateRange rangeForYearContainingDate:[NSDate date]];
基本上,我希望返回的
DateRange
对象包含目标日期周围的周、月或年的开始日期和结束日期。例如(在伪代码中):

更新:

多亏了这台机器,我才得以工作。以下是一周范围内的完整方法:

+ (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];
}

既然时间间隔是以秒为单位的,只需计算出一天中有多少秒:

60秒*60分钟*24小时=1天


然后在您的
rangeForDayContainingDate
方法中,您可以提取日期组件,获取当前日期,基于日期创建一个新日期,将小时和分钟设置为0:00,然后创建结束日期并添加上面计算的时间间隔。

为了完整起见,这里是我的最终解决方案(感谢Kendall Helmstetter Geln和jbrennan):


+1这看起来很有希望。日期组件可能正是我想要的。谢谢你,先生!你的回答为我指明了正确的方向。我已经发布了一周范围内的完整解决方案,作为对原始问题的编辑。不客气,请随意将你自己的答案标记为实际解决方案,而不是我的粗略说明。。。我不会生气。请不要这样做日期计算,使用基金会的日历API并添加
NSDateComponents
解决方案中您可能需要更改的一件事是使用
[[self alloc]init]
而不是
[[DateRange alloc…
,这样子类也会分配自己,而不是总是使用DateRange,它可能是它们的超类。@jbrennan:好的,我已经更改了它。这对我正在进行的一个项目有很大的帮助-谢谢你发布最后的答案!!
+ (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];
}
+ (NSCalendar *)calendar
{
    NSCalendar * gregorian = [[NSCalendar alloc]
                              initWithCalendarIdentifier:NSGregorianCalendar];
    return [gregorian autorelease];
}

////////////////////////////////////////////////////////////////

+ (NSDateComponents *)singleComponentOfUnit:(NSCalendarUnit)unit
{
    NSDateComponents * component = [[NSDateComponents alloc] init];

    switch (unit)
    {
        case NSDayCalendarUnit: [component setDay:1]; break;
        case NSWeekCalendarUnit: [component setWeek:1]; break;
        case NSMonthCalendarUnit: [component setMonth:1]; break;
        case NSYearCalendarUnit: [component setYear:1]; break;
    }

    return [component autorelease];
}

////////////////////////////////////////////////////////////////

+ (WM_DateRange *)rangeForUnit:(NSCalendarUnit)unit
               surroundingDate:(NSDate *)date
{
    WM_DateRange * range = [[self alloc] init];

    // start of the period
    NSDate * firstDay;
    [[self calendar] rangeOfUnit:unit
                       startDate:&firstDay
                        interval:0
                         forDate:date];
    [range setStartDate:firstDay];

    // end of the period
    [range setEndDate:[[self calendar]
        dateByAddingComponents:[self singleComponentOfUnit:unit]
                        toDate:firstDay
                       options:0]];

    return [range autorelease];
}

////////////////////////////////////////////////////////////////

+ (WM_DateRange *)rangeForDayContainingDate:(NSDate *)date
{ return [self rangeForUnit:NSDayCalendarUnit surroundingDate:date]; }

+ (WM_DateRange *)rangeForWeekContainingDate:(NSDate *)date
{ return [self rangeForUnit:NSWeekCalendarUnit surroundingDate:date]; }

+ (WM_DateRange *)rangeForMonthContainingDate:(NSDate *)date
{ return [self rangeForUnit:NSMonthCalendarUnit surroundingDate:date]; }

+ (WM_DateRange *)rangeForYearContainingDate:(NSDate *)date
{ return [self rangeForUnit:NSYearCalendarUnit surroundingDate:date]; }

////////////////////////////////////////////////////////////////

- (void)dealloc
{
    [endDate release];
    [startDate release];
    [super dealloc];
}