Xcode Entity Core Data - NSDate 错误的年份? [复制]

Posted

技术标签:

【中文标题】Xcode Entity Core Data - NSDate 错误的年份? [复制]【英文标题】:Xcode Entity Core Data - NSDate wrong year? [duplicate] 【发布时间】:2017-07-06 23:34:16 【问题描述】:

将值存储到核心数据时,日期存储为时间戳,但年份不正确。如何将正确的日期时间存储到核心存储中?

采取的步骤

使用 Xcode 和 Swift 我创建了一个 iPhone 项目并添加了一个具有以下属性的实体:

Attribute    Type
-------------------
name         String
date         Date

我正在使用核心数据来保存数据条目。例如:

 myEntity = MyEntity(context: self.viewContext)  
 myEntity.name = nameString
 myEntity.date = Date() as NSDate
 self.appDelegate.saveContext()

这会在手机上的 sqlite 数据库中创建记录。在手机上打开Sqlite数据库,可以看到创建的记录如下:

Z_PK    Z_NAME    Z_DATE
1       George    521035200

使用以下命令转换日期值:

SELECT datetime(521035200, 'unixepoch');

OUTPUTS: 1986-07-06 12:00:00

日期/月份是正确的,但年份应该是 2017 年。

SQLite 中时间戳的正确格式是什么?

是否可以使用 Xcode 实体而不是时间戳来存储日期?

【问题讨论】:

CoreData 存储不同纪元的日期。这不是 1970 年 1 月 1 日的标准 Unix 时代。 是的,它似乎以不同的偏移量存储它们 - 当使用实体将值转换回来时,日期是正确的。 查看Date (NSDate) 的文档以了解所用纪元的详细信息。 NSDate 参考日期是 2001 年 1 月 1 日 00:00:00 UTC。这是从 OS X 发布中得出的。 【参考方案1】:

Core Data 将其 SQLite 文件的布局视为私有实现细节。尽管打开和检查文件以进行调试和分析显然是有效的,但您不应该计划将其作为应用程序或更广泛的数据流的一部分系统地执行。如果你这样做了,那么你将自己耦合到一个私有的实现细节,所以你应该期望你的代码会任意中断并且没有追索权。

话虽如此,NSDate 参考日期is 00:00:00 UTC on 1 January 2001 因此,如果您是一个试图检查某些数据以进行验证的人,那么您很可能会看到一个偏移量。

您可以将时间戳存储为 NSDate 以外的其他内容,但这样做没有任何好处,因为它不会解决您与非保证结构的耦合,并且它会让您使用 Core数据更丑。

【讨论】:

只是想在数据库中创建一些虚拟数据来测试我抛出的日期。感谢您的解释。

以上是关于Xcode Entity Core Data - NSDate 错误的年份? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 使用Core Data

EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?

为啥实体框架 System.Data.Entity.Core.Objects.RelationshipEntry 错误? (用于更改跟踪)

MVC 5 中的 System.Data.Entity.Core.ProviderIncompatible 异常

Entity Framework优化一:引发了“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常

不能使用“System.Data.Entity.Core.Objects.ObjectQuery”类型的实例调用