gpt4 book ai didi

cocoa - 如何在核心数据中存储没有时间的日期

转载 作者:行者123 更新时间:2023-12-03 16:05:57 25 4
gpt4 key购买 nike

我一直在尝试寻找一种在 iPhone 上使用 Core Data 存储日常数据的合理方法。

我的应用程序接收 csv 格式的数据,其中包含日期但没有时间:

date, cycles
2009-08-01, 123
2009-08-02, 234
2009-08-03, 345
2009-08-04, 456

存储此数据时,每天只能有一条记录。我认为最好的办法是创建一个要存储的 NSDate,但去掉时间和时区数据。

我可以使用 NSDateComponents 或 NSDateFormatter 轻松创建 NSDate,无需几小时、几分钟或几秒。然而,即使我将时区明确设置为 UTC 或从 GMT 算起的零秒,使用 NSLog() 输出创建的日期总是具有我的本地时区,例如:

2009-07-29 00:00:00 +0100

有谁知道在没有时间组件的情况下制作 NSDate 的更好方法吗?或者也许是存储日期的更好方法?

最佳答案

一个好的编程经验是始终以 UTC 格式存储日期。是否使用 Core Data 并不重要;你仍然需要做一些工作,因为苹果的日期类非常糟糕。

日期在内部表示为自引用日期(我认为是 2001 年 1 月 1 日 00:00:00)以来的秒数(尽管实际的引用日期并不是很重要)。要点是,NSDate 对象本身始终采用 UTC。如果您在 CSV 文件中获取的日期是本地日期,则需要执行以下操作来获取 UTC 时间:

NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]];

然后,我将时间设置为 00:00:00。现在您将在午夜以 UTC 格式保存日期。出于演示目的,您将使用配置了您选择的时区的 NSDateFormatter(如果您未指定时区,则系统时区为默认值)来显示这些日期。

不过,当您只处理日期时,时区并不重要。只要您确保将 NSDateFormatter 上的时区设置为 UTC,无论用户在设备上选择哪个时区,您都将始终显示相同的日期。

如果您不喜欢此解决方案,您可以随时以其他格式存储日期。您可以使用 double 或 int 以某种自定义格式存储日期(例如,自某个引用日期以来的天数),或者您甚至可以将自己的类滚动到按照您想要的方式精确建模日期并将其存储为 NSData 对象。只要类实现了 NSCoding,就可以将其序列化为 Core Data 中的 NSData 对象。您只需将Core Data中的属性类型设置为“Transformable”即可。

这里有很多选择,但没有一个需要编写您自己的 SQLite 查询和数据库。

关于cocoa - 如何在核心数据中存储没有时间的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1232203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com