2017-04-21 106 views
2

我被这种行为感到困惑:为什么dateformatter.date()默认返回UTC?

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz" 
let result = dateFormatter.date(from: "2017-04-12 12:12:12 GMT+1")! 

2017年4月12日11时12分12秒UTC

为什么结果自动转换为UTC?我怎样才能获得相同的时区?

+0

处理一个标准化系统(如Unix时间戳或UTC时间)使得处理这个数据MUUUUUUCH更容易。当你比较两个表示相同时间点但在不同时区的'Date'实例时,你会期望发生什么? – Alexander

+0

是的,这是有道理的。但我如何实现上述目标? – Houman

+1

可以这样想:Date是表示时间的数据类型。它不知道任何关于时区,日期,月份,年份等的信息。无论您是希望在格林威治时间格林威治标准时间+1还是中国日历中及时表达某一时刻,代表它们的“日期”都是一样。这是其他'DateFormatter'和其他像它一样的结构(例如'Calendar','DateComponents')的工作,可以根据某些规则集合(日历系统指定的)将'Date'转换为人类表示)。 – Alexander

回答

0

Date对象封装在单个时间点,独立于任何特定 历法系统或时区的。日期对象为 不可变,表示相对于绝对引用日期的不变时间间隔。

这是一种国际标准,使UTC格式化为默认输出。所有其他环境中的大多数系统/语言也通过此默认数据类型处理时间。

您可以更改输入/输出格式为您的目的。

let dateString = "Thu, 22 Apr 2017 00:28:17 +0000" 
let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "EEE, dd MMM yyyy hh:mm:ss +zzzz" 
dateFormatter.locale = Locale.init(identifier: "en_GB") 
let dateObj = dateFormatter.date(from: dateString) 
dateFormatter.dateFormat = "dd-MM-yyyy" 
print("Dateobj: \(dateFormatter.string(from: dateObj!))") 
+0

谢谢。这不是swift3代码,但即使在转换后,也不会起作用。 'TimeZone.current.identifier'已经被'欧洲/伦敦' – Houman

+0

纠正为swift3 - 它现在有效吗? – Felix

+1

这个答案并不正确。 “日期”只是一个时间点的表示。而已。这不是UTC。 UTC直到“日期”转换为“字符串”才会发挥作用。默认情况下,Date的'description'或'debugDescription'就是'Date'到String的转换,而字符串恰好显示在UTC时区。 – rmaddy