0

我正在尝试使用 RestKit 将数据导入和映射到 CoreData。

这是来自 API 的数据。

active": false,
"date": "2012-09-09",
"desc": "",
"end": "18:30",
"location": "",
"simStatus": "Accepted",
"start": "17:00",
"title": "The title"

当我尝试将这些映射到 Core Data 时,有时会更改日期。例如,上述存储在 Core Data 中的数据将以 start = 1970-1-1 23:00 和 end = 1970-1-1 00:30 结束?

API 发送过来的时间是当地时间,API 知道应用程序的使用时间和地点。想想体育赛事,我们知道客场比赛的地点/时间。

我需要将这些时间和日期存储在 Core Data 中,即 API 将它们交给它们的确切时间 hh:mm。不确定为什么 Core Data 或 Restkit 决定改变它们?我理解 1970 部分的开始和结束没有日期,但为什么要更改时间?

有谁知道解决方案?

下面是 RestKit 映射代码,我尝试过使用时区、无时区、本地时区、UTC 时区等...我也尝试过使用和不使用 en_US_POSIX。

NSDateFormatter* timeFormatter = [NSDateFormatter new];
[timeFormatter  setDateFormat:@"HH:mm"];
timeFormatter.timeZone = [NSTimeZone localTimeZone];
timeFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

NSDateFormatter* dateFormatter = [NSDateFormatter new];
[dateFormatter  setDateFormat:@"yyyy-MM-dd"];
dateFormatter.timeZone = [NSTimeZone localTimeZone];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
gameMapping.dateFormatters = [NSArray arrayWithObjects:dateFormatter, timeFormatter, nil ];

[gameMapping mapKeyPath:@"start"     toAttribute:@"start"];
[gameMapping mapKeyPath:@"end"       toAttribute:@"end"];
.......
4

1 回答 1

1

正如 Hot Licks 在他的评论中指出的那样,所有NSDate对象都是 UTC,所以这就是您在打印出来时所看到的。因为您正在明确解析设备时区中的值,所以当您查看生成的 UTC 值时会看到变化。

通常,我强烈建议将内容作为完整的日期和时间值发送,包括时区偏移量。(例如,"2012-09-09T18:30:00-05:00"。)涉及的变量太多,无法明确说明所有内容。或者至少将时区作为单独的(但仍然是明确的)值传递。

如果您对服务器端没有任何控制权(正如您所说的那样),那么您将值解析为 UTC 的解决方法然后希望事情匹配 - 虽然风险和脆弱 -听起来这可能是您拥有的最佳选择。

于 2012-08-23T15:36:41.850 回答