如何将 JSON 日期反序列化为 objective-c 中的 NSDate?

How to deserialize JSON date to NSDate in objective-c?

我有一个来源日期字符串

/日期(1455895287677-0500)/

在 objective-c 中。我需要将其转换为类似“2015-01-01 HH:MM:SS”

的格式

如何将其转换为 Date 或 NSDate?

我正在使用 JSONModel,但它似乎不起作用。

嗯,这是一种非标准的日期格式。看起来像是自 1970 年以来的毫秒数,加上时区。您不需要将其转换为“2015-01-01 HH:MM:SS”之类的内容,您需要一个 NSDate。

取字符串,检查是否以/Date(开头,以)/结尾,去掉这些,检查中间是否有+或-,拆分为+或-之前的部分和开始的部分使用 + 或 -,为第一部分调用 doubleValue 并除以 1000(因此自 1970 年以来你有秒数),为第二部分调用 integerValue,因此你将获得小时和分钟,但采用十进制格式。取该整数值,除以 100 得到小时数,从数字中减去小时数乘以 100,剩下的就是分钟数。添加小时 * 3600 和分钟 * 60 到时间。然后 [NSDate dateWithTimeIntervalSince1970]。

显然要进行一些测试,如果有任何您没有预料到的情况,请记录下来并确保您已处理它。

正如我在问题中提到的,我最初尝试使用 JSON 模型反序列化日期字符串,例如“/Date(1455895287677-0500)/”,但它失败了。原因是 JSONModel 不支持 NSDate。

不过,幸运的是,我们可以通过修改和添加方法到 JSONModel.

  1. [NSDate class]添加到allowedJSONTypes in JSONModel.m 如果您使用 JSONModel(https://github.com/icanzilb/JSONModel) 反序列化您的 JSON 字符串。

  2. 创建一个名为 JSONValueTransformer+NSDate.m.h 的文件作为嗯(你可以重命名它们)在文件夹 JSONModelTransformations.

  3. 将此代码添加到您新创建的 .m 文件中,并且不要忘记在 .h 中写入接口文件(我计划将方法添加到 JSONValueTransformer.m 文件,但为了区分,我决定创建新的 .m 和 .h 文件)。

    (NSDate ) NSDateFromNSString:(NSString)string {

            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:APIDateFormat];
            return [formatter dateFromString:string]; 
    

    }

  4. Parsing JSON dates on IPhone 中@jasongregori 提供的方法添加到新创建的 .m 文件中。

  5. 步骤 3 中的方法将处理日期格式,如“2013-08-26T15:23:37.832Z”。如果日期格式是这样的/Date(***********-****)/,则必须调用步骤4中的方法。