EVReflection.setDateFormatter()支持多种格式

时间:2018-01-12 14:55:11

标签: ios iphone swift datetime json-deserialization

我在swift中遇到了从JSON反序列化我的DateTime字符串的问题。

我有包含多个NSDate值的实体(从.NET WebAPI服务器接收)。我的问题是,一些JSON属性包含如下格式的日期字符串:"yyyy-MM-ddTHH:mm:ss",有些包含毫秒,如下所示:"yyyy-MM-ddTHH:mm:ss.SSS"

在实体初始化程序中,有语句选择我的NSDateFormatter(没有它没有日期字符串被反序列化):

EVReflection.setDateFormatter(NSDateFormatter.isoDateFormatter())

isoDateFormatter看起来像这样:

class func isoDateFormatter() -> NSDateFormatter {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss"
    formatter.locale = NSLocale.currentLocale()
    return formatter
}

将我的实体映射到一个对象后,包含毫秒的NSDate属性未映射到对象,而这些属性nil,而没有毫秒的属性被映射

示例:

{
"startTime" : "2018-10-05T10:15:00",    // is deserialized
"startTrackingTime" : "2018-10-05T10:14:59.637"    // is not deserialized
}

我想要完成的只是将所有日期字符串反序列化为NSDate属性,我甚至不需要毫秒部分,但我不知道如何告诉EVReflection使用多个NSDateFormatter或多个日期时间格式或者只是忽略毫秒部分。

编辑:我不能使用NSISO8601DateFormatter因为它不支持iOS 9,只支持iOS 10 +

1 个答案:

答案 0 :(得分:0)

我发现这种情况的唯一解决方案是为具有不同日期格式的属性定义自定义属性转换器。

这是我使用过的一个自定义属性转换器的示例。

key: "startTrackingTime",
decodeConverter: {
    let formatter = NSDateFormatter.isoMilisecondsDateFormatter()
    self.startTrackingTime = formatter.dateFromString($0 as! String)
},
encodeConverter: {
    let formatter = NSDateFormatter.isoMilisecondsDateFormatter()
    if self.startTrackingTime != nil {
        return formatter.stringFromDate(self.startTrackingTime!)
    } else {
        return ""
    }
}

isoMilisecondsFormatter()

的位置
class func isoMilisecondsDateFormatter() -> NSDateFormatter {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS"
    formatter.timeZone = NSTimeZone(abbreviation: "UTC")
    formatter.locale = NSLocale.currentLocale()
    return formatter
}

所以,我必须为每个未收到的属性指定精确的格式化程序 (让我们说)“默认”格式,这似乎是一种真正的hacky方式,但我不知道更好。

如果有人有更好的解决方案,我会很感激与他人分享。