【问题标题】:CoreData's `Date` type transforms `0000-01-01T00:00:00Z` to `nil`CoreData 的 `Date` 类型将 `0000-01-01T00:00:00Z` 转换为 `nil`
【发布时间】:2015-05-12 14:50:14
【问题描述】:

我是 iOS 和 CoreData 的新手,如果这太基础了,我很抱歉。

我试图弄清楚为什么 0000-01-01T00:00:00Z 的有效但奇怪的日期被转换为 nil。例如:

calculatedAttrMapping.valueTransformer(@"0000-01-01T00:00:00Z"); // nil

我认为这个日期应该可行。它符合 RFC 和 ISO 规范。

new Date("0000-01-01T00:00:00Z"); //Sat Jan 01 0 07:00:00 GMT+0700 (ICT)

(不是说 JS 是相关的,而是作为一个直觉检查......)

我尝试在调试器中单步执行它,但在我看到任何有用的东西之前它就进入了汇编。

这是来自.xcdatamodeld GUI 中的配置吗? 这是故意行为吗?限制?

【问题讨论】:

  • 相关日期测试用例:stackoverflow.com/questions/10005374/…
  • 据我所知,ISO 格式日期与NSDateNSDateFormatter 不兼容。实际上,我最终编写了自己的 ISO 日期解析器(即 NSDate 到 ISO,ISO 字符串到 NSDate)。我会将日期保存为字符串,或者如果您需要将其用作 NSDate,请编写解析器。我假设您使用 Swift? `println(Date("0000-01-01T00:00:00Z")) 打印什么? (对不起,我没有 Xcode)。
  • 什么是calculatedAttrMapping
  • @TomHarrington 它是通过迭代 CoreData 托管对象的实体类实例的 attributes 来提取的。 stackoverflow.com/questions/15861892/…
  • @SimplGy Core Data 的所有类都没有valueTransformer 方法或属性。这就是我问的原因,因为您的示例代码行试图做什么并不明显。

标签: ios objective-c swift core-data


【解决方案1】:
let dateStringFormatter = NSDateFormatter()
dateStringFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
var d = dateStringFormatter.dateFromString("0001-01-01T00:00:00Z")

返回Some "Jan 1, 1, 6:42 AM"

let dateStringFormatter = NSDateFormatter()
dateStringFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
var d = dateStringFormatter.dateFromString("0000-01-01T00:00:00Z")

返回nil

这表明对于使用 NSDateFormatter 的 Swift,它无法解析 0000 年份。

如果我要说这适用于 CoreData 案例,这里有两个重要假设。

  1. Swift 和 Objective C 使用相同的代码路径解析日期
  2. Objective C 在解析 Date 类型的核心数据属性的日期时使用日期字符串格式化程序

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 2022-07-25
  • 2017-02-19
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多