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

是的,这与NSDate开始的一天和一天的结束是类似的,但是这个话题并没有讨论它是否适用于我在这里问的所有情况。 这个问题处理不回正确的价值,因为他们忘了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 ; } 

这不会处理边缘情况。 在巴西,夏令时要么消除或复制午夜一点的AM小时。 所以在某些日子里, 没有午夜,而在另一些日子里有两个午夜。

处理这个问题的正确方法是使自己的数据types代表一天中的某个时间(独立于date),或者使用NSDateComponents ,仅设置时间组件。

如果你想表示一个date,而不是一天中的某个时间,那么你最好使用当天中午,而不是使用午夜。 或者你可以创build自己的数据types,或使用NSDateComponents ,只存储日/月/年/年代。

强烈build议您尽快观看这些WWDCvideo:

  • WWDC 2011 Session 117:执行日历计算
  • WWDC 2013 Session 227:共同date和时间挑战的解决scheme