将给定时间的NSDate对象转换为具有相同时间和当前日期的最有效方法

时间:2011-02-27 23:24:29

标签: objective-c nsdate nsdateformatter nscalendar nsdatecomponents

我目前正在创建一个处理学校日程安排的计划应用程序。每个计划都有一个包含开始和结束时间的句点对象数组。目前我将这些时间存储为NSDate对象,其中只有时间才真正相关,并且每个NSDate对象都有一些与之关联的任意日期,这对我的应用程序来说几乎无关紧要(这是UIDatePicker分配给它的任何东西,但我只使用TimePickerMode )。这些日期我做了很多事情。首先,我使用NSDateFormatter为UITableView中的每个句点输出时间的字符串表示。然后我还尝试通过比较[NSDate日期]提取的当前时间与开始和结束时间来查找当天的当前时间段。但我无法确定最佳方法。

目前,我使用NSDateFormatter将开始和结束时间转换为字符串,然后返回到现在日期与今天日期相同的日期。然后我可以使用 - (NSComparisonResult)比较我的日期比较:比较开始和结束日期到当前日期。但是,我认为这是非常低效的。

其他可能的方法是将每个NSDate转换为NSDateComponents,然后使用NSCalendar将其转换回具有当前日期和相同原始时间的NSDate。

或者,我可以采取不同的方法并完全抛弃NSDate存储技术。相反,我可以将每个开始和结束时间存储为NSDateComponents,然后输出UITableView的格式化时间版本就足够了,然后我可以将[NSDate date]获得的日期转换为NSDateComponents用于逻辑比较以获得当前时期。

我看到了三到四种不同的方式,实际上在讨论之后我非常自信我讨论的最终方式将是最有效的,因为它需要在不同类型之间进行最少量的运行时转换日期对象。我只是在寻找其他人的投入。

2 个答案:

答案 0 :(得分:1)

使用NSDate存储时间的问题在于其值取决于时区。如果您的应用在前台或后台运行时时区或DST发生变化,那么您的所有时间都会突然出错。如果您实际将NSDate值保存到磁盘,则同上。 (一种选择是将应用程序的默认时区设置为UTC,但是您的应用程序“现在”的想法对用户来说是不正确的。)

我会单独存储时间并实现与NSDate进行转换的方法。您可以使用NSDateComponents存储时间,或者您可以将其存储为单个整数(例如,午夜时分),这使得比较两次变得微不足道。

在与NSDate之间转换分钟时,您使用NSDateComponents,并且需要确保您的UIDatePickers,NSCalendars和NSDateFormatters使用相同的时区,默认情况下是本地时区。

答案 1 :(得分:0)

您似乎担心NSDateFormatter目前会对您的程序征收的开销,以同步您的期间当天和当前日期。但实际上,你根本不关心日期,你只想要从一天开始以来的时间。

为什么不切断中间人?将开始和结束时间存储为NSTimeIntervals,这实际上只是双倍的。将开始和结束时间修改为86,400(一天中的秒数),以便将时间提取到新的一天开始后的几秒钟内的时间。你并不关心它代表什么日子,除了那天被表示为第二天。

然后每当您拉出当前的NSDate时,将其NSTimeInterval修改为86,400以获得以秒为单位的时间并将其与存储的周期值进行比较。整个过程中涉及的唯一对象转换将使用原始timeIntervalSinceReferenceDate。其余的是简单的mod和比较运算符,您可以将周期数存储为简单的NSTimeIntervals。