2017-04-25 107 views
0

我的情况如下:我从API调用中获得一个票据信息,并且在我的领域浏览器中可以看到我启动票证的日期以及过期时间被正确保存在UTC中的数据库中。境界NSDate没有被正确读取

在数据库中,使用Realm Browser,我可以看到startTime是2017年4月25日下午1:45:30,endTime是2017年4月26日上午6:45:30。 (我当地时间是在激活我的机票时 - 上午9:45:30 - 所以这是正确设置在服务器端)

但是,当我在代码中访问该日期后从数据库中检索它给我与偏移日期! (不,它不是本地时区的日期 - 它应该是以UTC保存的日期)。

下面是一些代码,我用它来从数据库中获取的信息,并显示它:

func getTickets() -> [Ticket] { 
     let tickets = userInfo?.tickets.filter("state == %@", "activated").map({ (dbTicket) -> Ticket in 
      var startTime: Date? = nil 
      var endTime: Date? = nil 
      if let start = dbTicket.startTime, let end = dbTicket.endTime { 
       print("START ", dbTicket.startTime, 
        "\nNOW ", NSDate(), 
        "\nEND ", dbTicket.endTime) 
       startTime = start as Date 
       endTime = end as Date 
      } 
      print("START ", dbTicket.startTime, 
        "\nNOW ", Date(), 
        "\nEND ", dbTicket.endTime) 
      return Ticket(id: dbTicket.id, startTime: startTime, endTime: endTime) 
     }) ?? [] 
     return tickets 
    } 

这里就是被打印到控制台上:

START Optional(2017-04-25 17:45:30 +0000) 
NOW 2017-04-25 13:46:15 +0000 
END Optional(2017-04-26 10:45:30 +0000) 

START Optional(2017-04-25 17:45:30 +0000) 
NOW 2017-04-25 13:46:15 +0000 
END Optional(2017-04-26 10:45:30 +0000) 

这是不正确! START应该与NOW几乎相同。那么为什么从Realm数据库中错误地读取START和END日期?尤其是我可以在Realm浏览器中看到它们,并且它们正确保存。

回答

1

NSDate代表一个独立于任何时区的特定时间点。当一个时区与NSDate关联的唯一时间是创建它的字符串表示形式(在你的情况下,这发生在print最终调用-[NSDate description]时)。如果您想要控制哪个时区格式化日期,您可以使用NSDateFormatter明确地将NSDate转换为字符串,从而允许您控制所用的时区。