【问题标题】:How do I store the time part of NSDateComponents?如何存储 NSDateComponents 的时间部分?
【发布时间】:2014-05-14 02:19:49
【问题描述】:

我想在 Core Data 中存储时间类型值(但不是日期)。我应该使用哪种数据类型?

【问题讨论】:

    标签: ios core-data nsfetchrequest type-conversion nsdatecomponents


    【解决方案1】:

    可能的选择:

    • 小时、分钟、秒的三个整数属性。
    • “HH:MM:SS”的一个字符串属性。
    • 一个整数属性,表示自午夜以来的秒数。

    最佳表示取决于涉及您想要的时间的查询类型 执行。如果您想搜索给定的小时、分钟或秒,第一个选项会更好。如果您必须搜索时间间隔,其他选项会更好。

    【讨论】:

    • 秒数无关紧要。澄清问题:这是一个药丸提醒应用程序。用户在他的设置中设置服用药物的时间,目标是每天在他选择的时间提醒他。
    • @mradlmaier:那么可能任何解决方案都可以。使用单独的小时/分钟属性,您可以轻松地创建 NSDateComponents 并从那里创建一个 NSDate(当天)。
    • 其实查询的不是时间。数据结构应该是这样的:早上 --> 8:00,中午 --> 12:00 等,其中用户预设如果早上为他将是 7:00 或 7:30 或 8:00 等. 查询将询问“获取早上时间”或“获取中午时间”...
    • @mradlmaier:有很多可能的表示。例如整数 0、1、2(分别代表早、中、晚)和两个整数分别代表小时和分钟。
    • 好的,一般的想法是不使用NSDate,而是使用整数。 (也许还有一些序数整数来支持按时间排序,以防我将每个组件存储为不同的属性)
    【解决方案2】:

    我的方法可能是将其转换为 HHMMSS 格式,可以是整数或字符串。 NSDate 不合适,因为它存储为自一个纪元以来的间隔(自 1970 年以来的秒数)

    【讨论】:

    • 此处不重要,但日期存储为自格林威治标准时间 2001 年 1 月 1 日“参考日期”以来的秒数。
    【解决方案3】:

    NSDate 的日期部分本质上是时间的一部分。 NSDate 是一个 NSTimeInterval 自参考日期以来正数或负数的秒数。使用语言环境和时区,您可以即时获得适当的本地化显示字符串。 在大多数情况下,将数字存储在 timeIntervalSinceReferenceDate 返回的 NSDate 后面会更有意义
    它小巧便携且正确。 然后用 dateWithTimeIntervalSinceReferenceDate 重新创建一个 NSDate:

    然后使用带有 NSLocale 和 NSTimeZone 的 NSDateFormatter 来获取适当的值以显示给用户。

    这是一套笨重而繁琐的工具,实际上可以帮助您正确地完成工作。 好消息是,您为此付出的所有努力都得到了回报,让下一次变得更容易,并为您提供可以做正确事情的代码,并具有实际上非常容易存储和操作的支持值。 此外,通过正确使用 API,您将不会失去精度,并有更多的可能性向您开放。

    尝试单独使用格式字符串似乎很容易和简单,但却是通往糟糕代码的道路。

    【讨论】:

    • 如果你说对于一个应该做任何类型提醒的应用来说秒数无关紧要,那么你并没有真正理解日历计算以及 Cocoa 为你提供的正确操作。
    • 你通常是对的。但在这个问题中,“09:00”表示任何天的早上 9 点,因此不是绝对的时间点。所以在这种特殊情况下(在我看来)存储小时/分钟而不是 NSDate 更有意义。
    • 有趣。它被用作标签吗?只是好奇它将如何同步到任何时区,以及它是否对每个区域都有意义。不过,您甚至可能不会针对许多语言环境。
    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多