这种方法是不是总是会在 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的可能重复 “时间间隔所代表的日子”是什么意思? NSTimeIntervals 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?的主要内容,如果未能解决你的问题,请参考以下文章

Emmeans 没有从模型中给我正确的调整方法

任何人都可以在 NSManagedObjectContext 中给我一些关于这个方法“refreshAllObjects”的参考吗

为什么FieldValue.increment()在Swift中给我一个错误?

MessageEmbed 字段值不能为空

在openfire中获取xmpp ios中的所有注册用户

为啥 python 编译器在 tkinder 模块中给我一个错误? [复制]