Realm NSDate未正确读取

时间:2017-04-25 13:58:36

标签: date swift3 realm realm-browser

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

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

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

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

SELECT tblTempP6.[Project #], tblTempP6.[Work Order #], tblTempP6.[Project Name], tblTempP6.[Activity Name], tblTempP6.[TOA #], tblTempP6.Start, tblTempP6.Finish, tblTempP6.[Budgeted Labor Units], tblTempP6.[S/S - SUBSTATION], tblTempP6.iCircuit, tblTempP6.isStreet, tblTempP6.[Test Group Work Type], tblTempP6.Comments, tblTempP6.[Resource IDs]

FROM tblTempP6 

LEFT JOIN shtP6DataEast ON tblTempP6.[Project Name] = shtP6DataEast.[Project Name]

WHERE (((shtP6DataEast.[Project Name]) Is Null));

以下是在控制台中打印的内容:

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应与现在几乎相同。那么为什么从Realm数据库中错误地读取START和END日期呢?特别是我可以在Realm浏览器中看到它们并且它们被正确保存。

1 个答案:

答案 0 :(得分:1)

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