【问题标题】:Incorrect timezone in Swift's DateIntervalSwift 的 DateInterval 中的时区不正确
【发布时间】:2017-11-20 20:59:44
【问题描述】:

我想将一些数据作为字典存储在我的应用程序中,相对于这些数据的创建日期。它应该看起来像这样:

// 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 创建的日期代表了给定时刻的正确信息,但来自Calendar.currentDateInterval 结构似乎默认为GMT+0 作为时区,所以我得到以下输出:

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

所以它比我/用户的时区晚了 2 小时。使用DateInterval 的正确方法是什么,它不会在时区中移动?

【问题讨论】:

标签: swift date calendar dateinterval


【解决方案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 EST”相当于“2017-11-20 21:14:09 +0000”。您始终可以使用

从 DateInterval 中检索原始日期对象
hourInterval?.start
hourInterval?.end

【讨论】:

  • 感谢您清除概念))只是因为字符串表示将用于在图表中显示信息而感到困惑,我担心所有组件都会搞砸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 2017-06-20
  • 2015-04-23
相关资源
最近更新 更多