这种方法是不是总是会在 ios 中给我当天的 12:00:00?
Posted
技术标签:
【中文标题】这种方法是不是总是会在 ios 中给我当天的 12:00:00?【英文标题】:Is this method going to always give me 12:00:00 of the current day in ios?这种方法是否总是会在 ios 中给我当天的 12:00:00? 【发布时间】:2013-07-13 22:18:18 【问题描述】:是的,这类似于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 ;
【问题讨论】:
NSDate beginning of day and end of day的可能重复 “时间间隔所代表的日子”是什么意思?NSTimeInterval
s don't represent days,它们代表间隔。你必须有一个起点才能让间隔给你一个终点。你的出发点是什么,为什么不从NSDate
开始?
为您的方法编写一个单元测试,日期范围涵盖太阳系的生命周期,目前是 +/- 4.5e9 年?
@hd1 - 感谢指向该主题的指针
@JoshCaswell - 该函数只是一个 sn-p。从我使用它的地方开始,它传递的时间间隔对用户来说确实代表了一天。我正在使用间隔,因为后端是核心数据,直接使用它们更容易。另外,正如您所指出的,这只是我最终想要的一个间隔——自午夜以来的秒数。
【参考方案1】:
这不会处理边缘情况。在巴西,DST 消除或复制了午夜到凌晨 1 点的时间。所以在某些日子里,有没有午夜,而在其他日子里,有两个午夜。
处理此问题的正确方法是让您自己的数据类型表示一天中的时间(独立于日期),或者使用NSDateComponents
,仅设置时间组件。
如果您想表示一个独立于一天中时间的日期,最好使用当天的中午而不是使用午夜。或者你可以创建自己的数据类型,或者使用NSDateComponents
,只存储日/月/年/纪元。
我强烈建议您尽快观看这些 WWDC 视频:
WWDC 2011 Session 117: Performing Calendar Calculations WWDC 2013 Session 227: Solutions to Common Date and Time Challenges【讨论】:
以上是关于这种方法是不是总是会在 ios 中给我当天的 12:00:00?的主要内容,如果未能解决你的问题,请参考以下文章
任何人都可以在 NSManagedObjectContext 中给我一些关于这个方法“refreshAllObjects”的参考吗