是的,这与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 ;
}
答案 0 :(得分:2)
这不会处理边缘情况。在巴西,DST要么消除或复制午夜到一小时。所以在某些日子里,没有午夜,而在其他日子里有两个午夜。
处理此问题的正确方法是,使您自己的数据类型表示一天中的时间(独立于日期),或者使用NSDateComponents
,仅设置时间组件。
如果你想表示一个日期,与一个时间无关,你最好在当天中午使用,而不是使用午夜。或者您可以创建自己的数据类型,或使用NSDateComponents
,仅存储日/月/年/时代。
我高度建议您尽快观看这些WWDC视频: