在 ObjectMapper 的 DateFormatterTransform 中设置自定义时区

Posted

技术标签:

【中文标题】在 ObjectMapper 的 DateFormatterTransform 中设置自定义时区【英文标题】:Set custom time zone in DateFormatterTransform in ObjectMapper 【发布时间】:2018-08-24 09:14:37 【问题描述】:

我对 ObjectMapper 时间字符串解析比较陌生,并且面临着一个巨大的问题。我有一个服务器以“yyyy-MM-dd'T'HH:mm:ss.SSZ”格式向我发送时间字符串,我应该在本地解析到我的 Date 对象。我的服务器正在向我发送本地时区的日期,即 GMT+8,所以假设我从服务器收到“2018-08-23T15:02:44.000Z”。我需要将其完全保存在我的领域文件中。我正在使用以下代码进行转换:

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSZ"
formatter.timeZone = TimeZone.current
recordDateTime <- (map["record_time"], DateFormatterTransform(dateFormatter: formatter))

但问题是保存在领域中的日期对象是 2018-08-23 11:02:44 PM。我相信 DateFormatterTransform 接受 GMT 区域中的日期字符串,因此它将其转换为我的本地时区,即 GMT+8。无论如何我可以手动设置 DateFormatterTransform 的时区,这样我就不会得到时移?我们目前无法更改服务器,因为数据库非常大,并且已经将每个日期都存储在本地时区中。

请建议如何解决这个问题。谢谢

【问题讨论】:

【参考方案1】:

发现这是最快的解决方案:编写了一个自定义日期格式化程序,它将在其 date(from: String) 方法中减去 GMT 偏移量。这是代码sn-p:

class MyDateFormatter : DateFormatter 

required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)


override init() 
    super.init()


override func date(from string: String) -> Date? 
    return super.date(from:string)?.addingTimeInterval(-8*60*60)

【讨论】:

以上是关于在 ObjectMapper 的 DateFormatterTransform 中设置自定义时区的主要内容,如果未能解决你的问题,请参考以下文章

ObjectMapper 的目标是啥?

ObjectMapper 的目标是啥?

ObjectMapper - 线程安全和性能的最佳实践

如何使用 AlamoFire/ObjectMapper 访问嵌入在 JSON 字典中的链接?

RepositoryRestMvcConfiguration 的 ObjectMapper 与 Spring Boot 默认的 ObjectMapper?

Alamofire,Objectmapper,Realm:嵌套对象