无法在 Swift 3 中更改 DateFormatter 的时区

Cannot change the timezone for DateFormatter in Swift 3

我刚刚将我的应用程序代码迁移到 Swift 3,我遇到了 DateFormatter(以前称为 NSDateFormatter)的这个非常烦人的问题,而我在 Swift 2 或更早版本中没有遇到。

问题是我需要将字符串转换为 Date 对象,我的代码类似于

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateStr1 = "2017-02-22"
let date1 = dateFormatter.date(from: dateStr1)

现在这在 Xcode 操场上工作正常,正如预期的那样,但是当我尝试从我的应用程序 运行 它时,date1 returns 2017-02-21 13:00:00 +0000 即过去的一天,我需要日期 1 为 2017-02-22 仅供参考,我在澳大利亚,我正在这样做发展。

我正在从我的应用程序的 UI 中获取日期字符串,而从 UI 中获取日期字符串是 2017-02-22,因此我需要将该字符串转换为日期(或 NSDate)对象Swift.

我已经尝试为 DateFormatter 设置时区和语言环境,

dateFormatter.timeZone = TimeZone(identifier: TimeZone.current.identifier)

dateFormatter.locale = Locale.init(identifier: Locale.current.identifier)

但还是没有运气?

我还尝试从日历组件创建日期,例如,

var dateComponents = DateComponents()
var day = "22"
var month = "02"
var year = "2017"
dateComponents.day = Int(day)!
dateComponents.year = Int(year)!
print(TimeZone.current)
dateComponents.timeZone = TimeZone.current
dateComponents.month = Int(month)!
let userCalendar = Calendar.current
let date1 = userCalendar.date(from: dateComponents)

但仍然没有得到正确的日期,即得到 2017-02-21 而不是 2017-02-22 我看过其他一些 SO 问题,例如

How do you create a swift Date object

等等。关于如何实现我想要的结果的任何想法?此代码在 Swift 之前运行良好。

正如 maddy 在评论中指出的那样,Xcode 以通用时区 - UTZ -(也称为格林威治标准时间)的“原始形式”向您显示日期。

要获得在另一个时区显示的日期,您需要再次使用 DateFormatter。

所以:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateStr1 = "2017-02-22"
let date1: Date = dateFormatter.date(from: dateStr1)!

print("\(date1)")
print("\(dateFormatter.string(from: date1))")

给你:

我 运行 这个代码位于西澳大利亚州珀斯(即 UTZ+8)- 因此当我将 22-Feb-2017 转换为日期时,它存储为 21-Feb-2017 UTZ,但是如果我用我的语言环境中的 DateFormatter 返回它,我会在 2017 年 2 月 22 日午夜。