我想在我的应用程序中将一些数据存储为相对于创建此数据的日期的字典。看起来应该是这样的:
// hours
[ 17:00 - 18:00 : 34.5,
18:00 - 19:00 : 41.2,
... ]
// days
[ 2017-11-19 - 2017-11-20 : 37.9,
2017-11-20 - 2017-11-21 : 31.1,
... ]
DateInterval
结构似乎是这本词典中键的完美候选者。但是当我运行一些基本测试时,我发现虽然使用Date()
init创建的日期代表了给定时刻的正确信息,但来自DateInterval
的{{1}}结构似乎默认为GMT + 0作为时区,所以我得到以下输出:
Calendar.current
所以我/用户的时区已经过了2个小时。使用let date = Date() //outputs "Nov 20, 2017 at 10:32 PM"
let hourInterval = Calendar.current.dateInterval(of: .hour, for: date)
//outputs: 2017-11-20 20:00:00 +0000 to 2017-11-20 21:00:00 +0000
的正确方法是什么,因此它不会在时区中移位?
答案 0 :(得分:1)
iOS中日期的内部结构始终是GMT。你所看到的是字符串表示。内部日期仍然相互一致。考虑一下这个游乐场代码:
//: Playground - noun: a place where people can play
import UIKit
import XCTest
import PlaygroundSupport
let fourHours:Double = -1 * 60 * 60 * 4
var newDate = Date()
let oldDate = Date(timeInterval: fourHours, since: newDate)
let interval = DateInterval(start: oldDate, end: newDate)
let hourInterval = Calendar.current.dateInterval(of: .hour, for: newDate)
输出如下:
即使日期显示为当地时间(EST),可打印的表示也是GMT。但是时间被抵消了,所以' 2017年11月20日美国东部时间下午4:14'相当于' 2017-11-20 21:14:09 + 0000'。您始终可以使用
从DateInterval中检索原始日期对象hourInterval?.start
hourInterval?.end