这种方法总是在ios中给我当天的12:00:00吗?

时间:2013-07-13 22:18:18

标签: ios nsdate nstimeinterval

是的,这与NSDate beginning of day and end of day相似,但该主题并没有讨论它是否适用于我在这里要求的所有情况。这个问题涉及到没有找回正确的值因为他们忘记了NSDayCalendarUnit。这个问题正在处理价值的准确性,因为事实证明这不符合我所怀疑的DST。

在我的应用程序的几个部分中,我需要指定一天中的时间而不关心实际的一天,例如,每天下午4:00进行此活动。我看过一些帖子谈论如何做到这一点,但希望对我的方法提出反馈。以下方法旨在返回任何特定日期的午夜,并将与表示特定时间的秒数(例如,上午1:00:00为3600)的偏移量一起使用。

我相信它应该可行,但我很好奇它是否会处理夏令时等边缘情况。对于任何反馈,我们都表示感谢。谢谢!

// We want to return 12:00:00AM of the day represented by the time interval
NSTimeInterval getStartOfDay(NSTimeInterval t)
{
   // first convert the time interval to an NSDate
   NSDate *ourStartingDate = [NSDate dateWithTimeIntervalSinceReferenceDate:t] ;

   // get just the year, month, and day of our date
   unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
   NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
   NSDateComponents *comps = [gregorian components:unitFlags fromDate:ourStartingDate];
   NSDate *ourConvertedDate = [gregorian dateFromComponents:comps] ;

   // put that date into a time interval
   NSTimeInterval convertedInterval = [ourConvertedDate timeIntervalSinceReferenceDate] ;

   // because the time interval is in GMT and we may not be, we need to get an offset
   NSInteger timeZoneOffset = [[NSTimeZone localTimeZone ] secondsFromGMT] ;

   // account for the time zone difference
   convertedInterval = convertedInterval - timeZoneOffset ;

   // still might have a Daylight Savings Time issue?
   return convertedInterval ;
}

1 个答案:

答案 0 :(得分:2)

这不会处理边缘情况。在巴西,DST要么消除或复制午夜到一小时。所以在某些日子里,没有午夜,而在其他日子里有两个午夜。

处理此问题的正确方法是,使您自己的数据类型表示一天中的时间(独立于日期),或者使用NSDateComponents,仅设置时间组件。

如果你想表示一个日期,与一个时间无关,你最好在当天中午使用,而不是使用午夜。或者您可以创建自己的数据类型,或使用NSDateComponents,仅存储日/月/年/时代。

高度建议您尽快观看这些WWDC视频: