swift - Swift 的 DateInterval 中的时区不正确

标签 swift date calendar dateinterval

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

// 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 中的 DateInterval 结构.current 似乎默认为 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 的正确方法是什么,这样它就不会在时区中移动?

最佳答案

iOS 中日期的内部结构始终是 GMT。您看到的是字符串表示形式。内部日期仍然相互一致。考虑这个 Playground 代码:

//: 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)

输出看起来像这样:

result

尽管日期显示为本地时间 (EST),但可打印的表示形式为格林威治标准时间。虽然时间有所偏移,因此“2017 年 11 月 20 日下午 4:14 EST”相当于“2017-11-20 21:14:09 +0000”。您始终可以使用

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

关于swift - Swift 的 DateInterval 中的时区不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47400959/

相关文章:

android - 在 DatePicker 中设置自定义日期

Swift – Balloons.playground – 无法将 "textures"添加到时间轴

android - 设置结束日期选择器的最小日期超过开始日期选择器在 android 中选择的日期不工作

date - 使用 Pig 提取季度数据

PHP - 当周从星期一以外的一天开始时,获取给定周数的第一天

java - 如何在 Java 中将日历增加 7 天直到下个月,然后从开始日期开始一年?

ios - swift 中的函数指针

ios - 如何将图像从 AWS S3 加载到 UICollectionView 中?

ios - 如何通过 NSDictionary 中的键 :value, 过滤 NSArray

Google 电子表格中的日期单元格在脚本中产生整数