我的情况如下:我从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浏览器中看到它们并且它们被正确保存。
答案 0 :(得分:1)
NSDate
表示特定时间点,与任何时区无关。时区与NSDate
关联的唯一时间是在创建字符串表示形式时(在您的情况下,这会在print
最终调用-[NSDate description]
时发生)。如果您想控制格式化日期的时区,可以使用NSDate
将NSDateFormatter
显式转换为字符串,这样您就可以控制使用的时区。