0

我的情况如下:我从 API 调用中获得票证信息,我可以在我的领域浏览器中看到,我激活票证的日期和到期时间以 UTC 格式正确保存在数据库中。

在数据库中,使用 Realm Browser,我可以看到 startTime 是 Apr 25, 2017, 1:45:30 PM,endTime 是 Apr 26, 2017, 6:45:30 AM。(在激活我的票时,我的当地时间是上午 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 Browser 中看到它们并在那里正确保存。

4

1 回答 1

1

NSDate表示一个特定的时间点,与任何时区无关。时区与 an 关联的唯一时间NSDate是在创建它的字符串表示形式时(在您的情况下,这发生在print最终调用时-[NSDate description])。如果您想控制日期格式的时区,您可以NSDate使用 显式转换为字符串NSDateFormatter,这样您就可以控制所使用的时区。

于 2017-04-25T15:30:11.543 回答