首页 文章

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

提问于
浏览
1

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

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

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

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

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

2 回答

  • 1

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

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

    将分钟转换为NSDate和从NSDate转换分钟时,您需要使用NSDateComponents,并且需要确保您的UIDatePickers,NSCalendars和NSDateFormatters使用相同的时区,默认情况下该时区是本地时区 .

  • 0

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

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

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

相关问题