NSDate和第二天

时间:2011-07-31 00:21:15

标签: objective-c cocoa macos nsdate

我以前做的是使用时间戳,然后添加86400秒(24 * 60 * 60)。当我读到最近关于stackoverflow的一个问题时,注意到每天都不正确,我想改变它。

因此我接下来要做的就是使用NSDateComponents。我只是得到当天并添加1.现在我想知道这是多么“聪明”。就像当天等于31一样,是否将日期设置为1,将月份设置为+1(或者再次为12比1)?我可以手动执行此操作,但这只适用于格里高利历,所以我真的不知道这是否是一个很好的解决方案..

2 个答案:

答案 0 :(得分:3)

这很聪明,除非你想让它变得愚蠢。

来自the documentation for -[NSCalendar dateByAddingComponents:toDate:options]

  

如果没有指定选项(传递0),则单位中的溢出会进入较高的单位(如典型的加法)。

如果你希望单位溢出到更高的单位,那么你会传递“NSWrapCalendarComponents”作为options:参数的值。

答案 1 :(得分:0)

小心DST。不同的时区是不同的。 AND发生在午夜 我相信如果您通过添加组件:toDate:options来调用[NSCalendar date]并且您的日期在11-12 pm之间,则由于DST,您可能会丢失或重新运行一天。 要解决这个问题,建议您在当天中午更改日期,然后再添加日期。

// increment by 1 calendar day
// and convert back to NSDate objects
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setDay:1];

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setTimeZone:self.myTimeZone]; // time zone of location;  

// Use local noontime for the date to avoid problems around
// midnight, particularly near daylightsavings time discontinuities. 
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* dateComponents = [gregorian components:unitFlags fromDate:date];

dateComponents.hour = 12;
NSDate* noonDate = [gregorian dateFromComponents:dateComponents];

NSDate *newDate = [gregorian dateByAddingComponents:comps toDate:noonDate options:0];

我不确定选项:0设置,但我对此进行了彻底的测试。我用它来获得一个包含10天日期的数组。它可以围绕各种日/月/年的不连续性进行正确的包装。如果要测试,请查看应用程序商店上的SunPose Rise Set。 (是的,它是免费的)