NSDate 在 CoreData 中被保存为时间戳

Posted

技术标签:

【中文标题】NSDate 在 CoreData 中被保存为时间戳【英文标题】:NSDate being saved as timestamp in CoreData 【发布时间】:2014-05-26 00:24:10 【问题描述】:

我目前正在 CoreData 中的 ios 应用程序中保存日期。在 Core Data 中,我的日期属性是“日期”类型。在我的 NSManagedObjectSubclass 文件中,该属性的类型为:NSDate(这很好)。 Core Data 中的日期存储为:2014/05/16 14:54:51,当我在我的 SQLite3 导航器中检查实际值时,它以以下形式存储:

421959291.293972 为日期

如何获取上述日期值,有没有办法将其转换回形式:2014/05/16 14:54:51?我问这个是因为我试图通过 CSV 文件创建数据集,并希望确保我在 CSV 文件中输入的所有值都被 Core Data/SQLite3 正确转换为正确的格式。

【问题讨论】:

我相信 NSDate 是从一个固定的参考点(例如参见 -[NSDate timeIntervalSinceReferenceDate])以 NSTimeInterval(双精度)形式存储的。因此,从这个角度来看,您所看到的完全有道理。如果你 NSLog() 导入日期后的日期,你会以更友好的格式看到它们。您的问题来了,因为您直接在存储中查看它们,而这只是用于存储日期的表示形式。 我正在为我的应用程序创建测试数据,这就是为什么我想通过带有正确格式日期的 csv 文件预填充我的 SQLite3 数据库。通过将数据导出为 csv 文件并发现给我一个十进制格式的日期(即时间戳),我想知道是否有办法以这种格式创建日期(十进制/时间戳),用这个值填充我的数据库,并让它以正确的格式出现在我的应用程序中 (2014/05/16 14:54:51)? 阅读本文的任何人都感到困惑的是,您提到了 Core Data/SQLite3 - 它是什么?您正在处理核心数据数据库吗?在这种情况下,不推荐直接使用 SQLite 绕过它。你最好阅读这个文件并使用标准的 Core Data APIs 来输入它。但是,除此之外,我相信您在尝试使用 NSDate 时并没有完全了解它应该如何使用——我建议您观看最近关于日期/日历计算的 WWDC 会议并阅读编程指南。这个话题比许多人认为的要复杂。 核心数据是我在我的应用程序中使用的一部分,但是,我使用 SQLite3 数据库浏览器来查看存储在我的应用程序中的数据。这就是我能够查看原始数据的方式。 其他***问题的重复***.com/questions/10705062/…。 【参考方案1】:

如果您使用 sqlite3 作为命令行工具,请使用 datetime 函数来解释数据,例如

sqlite3> .schema
create table ZENTITY (... ZSTARTDATE TIMESTAMP, ...)
sqlite3> select datetime(zstartdate,'unixepoch','31 years') from ZENTITIY;

这应该给出存储在实体表中的格式化时间戳

unix epoch/31 years 参数来自这个堆栈溢出问题。 Behind The Scenes: Core Data dates stored with 31 year offset?

【讨论】:

对于其他来这里寻找关于解释 iOS 应用程序存储在 sqlite 中的日期的提示的人:一些应用程序(愚蠢地)将时间戳保存为当地时间而不是 UTC;在这种情况下,您需要在 datetime 调用中添加一个 'localtime' 参数,例如datetime(foo, 'unixepoch', '31 years', 'localtime') - 对于英国用户来说尤其棘手(比如说)本地时间 == UTC 半年而不是另一半!

以上是关于NSDate 在 CoreData 中被保存为时间戳的主要内容,如果未能解决你的问题,请参考以下文章

搜索 CoreData 以匹配 NSDate - Swift

CoreData 中的 NSDate 是不是封装了时区?

如何使用firebase-admin在firestore中将日期保存为时间戳?

为啥 NSDate() 在 CoreData 中存储一个奇怪的值

CoreData 更新后不保存信息

php怎么将指定日期转换为时间戳