私の状況は次のとおりです。API 呼び出しからチケット情報を取得し、レルム ブラウザで、チケットを有効にした日付と期限切れの日付が UTC でデータベースに正しく保存されていることを確認できます。
データベースで 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 とほぼ同じはずです。では、なぜ START と END の日付が Realm データベースから誤って読み取られるのでしょうか? 特に、Realm Browser で確認でき、正しく保存されていることがわかります。