0

是的,这类似于NSDate beginning of day 和 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 ;
}
4

1 回答 1

2

这不会处理边缘情况。在巴西,DST 消除或复制了午夜到凌晨 1 点的时间。所以有些日子没有午夜,有些日子有两个午夜。

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

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

强烈建议您尽快观看这些 WWDC 视频:

于 2013-07-13T22:32:49.197 回答