【问题标题】:How to deserialize JSON date to NSDate in objective-c?如何在objective-c中将JSON日期反序列化为NSDate?
【发布时间】:2016-03-08 16:18:56
【问题描述】:

我有一个源日期字符串

/日期(1455895287677-0500)/

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

如何将其转换为 Date 或 NSDate?

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

【问题讨论】:

  • 数字代表什么?对于 UNIX 时间戳,它太大了
  • @vadian:取这个数字,除以 60*60*24*365.25 得到大约 46,000。 1970 年过去了 46 年。所以显然这是自纪元以来的时间,以毫秒为单位
  • 有道理:-)

标签: objective-c json date datetime jsonmodel


【解决方案1】:

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

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

显然要进行一些测试,记录是否有任何您没有预料到的事情,并确保您处理了它。

【讨论】:

【解决方案2】:

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

不过,幸运的是,我们可以通过对 JSONModel 进行修改和添加方法,通过几个步骤来实现这一目标。

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

  2. 在文件夹 JSONModelTransformations 中创建一个名为 JSONValueTransformer+NSDate.m 的文件和 .h 文件(您可以重命名它们) >.

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

    (NSDate ) NSDateFromNSString:(NSString)string {

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

    }

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多