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

Objective c 将具有给定时间的NSDate对象转换为具有相同时间和当前日期的对象的最有效方法,objective-c,nsdate,nsdateformatter,nscalendar,nsdatecomponents,Objective C,Nsdate,Nsdateformatter,Nscalendar,Nsdatecomponents,我目前正在创建一个调度应用程序,用于处理学校的调度。每个计划都有一个包含开始时间和结束时间的时段对象数组。目前,我将这些时间存储为NSDate对象,其中只有时间才是真正相关的,每个NSDate对象都有一些与之关联的任意日期,这些日期对我的应用程序来说基本上是无关紧要的(UIDATECIPKER分配给它的是什么,但我只使用TIMECIPKERMODE)。我用这些日期做了很多事情。首先,我使用NSDateFormatter在UITableView中输出每个时段的时间字符串表示形式。然后,我还尝试通过

我目前正在创建一个调度应用程序,用于处理学校的调度。每个计划都有一个包含开始时间和结束时间的时段对象数组。目前,我将这些时间存储为NSDate对象,其中只有时间才是真正相关的,每个NSDate对象都有一些与之关联的任意日期,这些日期对我的应用程序来说基本上是无关紧要的(UIDATECIPKER分配给它的是什么,但我只使用TIMECIPKERMODE)。我用这些日期做了很多事情。首先,我使用NSDateFormatter在UITableView中输出每个时段的时间字符串表示形式。然后,我还尝试通过将[NSDate date]获取的当前时间与开始和结束时间进行比较来查找当天的当前时段。但是我很难决定最好的方法

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

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

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


我看到了三到四种不同的方法,事实上,经过讨论,我确信我讨论的最后一种方法是最有效的,因为它需要在不同类型的日期对象之间进行最少的运行时转换。我只是在寻找其他人的输入。

您似乎担心NSDateFormatter当前在您的程序上为同步您的周期日期和当前日期而征收的开销。但实际上,你根本不在乎日期,你只想要从一天开始的时间

为什么不去掉中间人呢?将开始时间和结束时间存储为NSTimeInterval,这实际上只是两倍。将开始和结束时间修改为86400秒,即一天中的秒数,以便将时间提取为新一天开始后的秒数。您并不真正关心它代表的是哪一天,只是那一天被表示为第二个0


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

您似乎担心NSDateFormatter当前在程序上为同步周期的日期和当前日期而征收的开销。但实际上,你根本不在乎日期,你只想要从一天开始的时间

为什么不去掉中间人呢?将开始时间和结束时间存储为NSTimeInterval,这实际上只是两倍。将开始和结束时间修改为86400秒,即一天中的秒数,以便将时间提取为新一天开始后的秒数。您并不真正关心它代表的是哪一天,只是那一天被表示为第二个0


然后,每当拉取当前NSDate时,将其NSTIME间隔修改86400以获得秒为单位的时间,并将其与存储的周期值进行比较。整个过程中涉及的唯一对象转换是使用基本的timeIntervalSinceReferenceDate。其余的是简单的mod和comparison运算符,您可以将时段号存储为简单的nstimeinterval。

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

我将分别存储时间,并实现与NSDate之间的转换方法。您可以使用NSDateComponents存储时间,也可以将其存储为单个整数(例如,午夜后几分钟),这使得比较两次时间变得很简单


在NSDate和NSDate之间转换分钟时,使用NSDate组件,并且需要确保UIDATE选择器、NSCALENDAR和NSDATEFormatter使用相同的时区,默认情况下是本地时区。

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

我将分别存储时间,并实现与NSDate之间的转换方法。您可以使用NSDateComponents存储时间,也可以将其存储为单个整数(例如,午夜后几分钟),这使得比较两次时间变得很简单

在NSDate和NSDate之间转换分钟时,使用NSDate组件,并且需要确保UIDatePi