0

私の状況は次のとおりです。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 で確認でき、正しく保存されていることがわかります。

4

1 に答える 1

1

NSDateタイムゾーンに関係なく、特定の時点を表します。タイムゾーンが に関連付けられるのNSDateは、その文字列表現を作成するときだけです(あなたの場合、これは最終的にprintを呼び出すときに起こります-[NSDate description])。日付がフォーマットされるタイムゾーンを制御したい場合は、 を使用して明示的にNSDate文字列に変換NSDateFormatterできます。これにより、使用されるタイムゾーンを制御できます。

于 2017-04-25T15:30:11.543 に答える