ios - 无法更改 Swift 3 中 DateFormatter 的时区

标签 ios swift3 nsdateformatter nstimezone dateformatter

我刚刚将应用程序的代码迁移到 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 Playground 中工作得很好并且符合预期,但是当我尝试从我的应用程序运行它时,date1 返回2017-02-21 13:00:00 +0000,即一天过去,我需要 date1 为 2017-02-22 仅供引用,我在澳大利亚正在进行这项开发。

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

我尝试为 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 我看过其他一些问题,比如

How do you create a swift Date object

Converting date between timezones swift

等等。关于如何实现我想要的结果有什么想法吗?在 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))")

给你:

Print screen of code in playground with output.

我在西澳大利亚珀斯(即 UTZ+8)运行此代码 - 因此,当我将 2017 年 2 月 22 日转换为日期时,它会存储为 2017 年 2 月 21 日 UTZ,但如果我将其返回使用我所在区域的 DateFormatter,我得到了 2017 年 2 月 22 日午夜。

关于ios - 无法更改 Swift 3 中 DateFormatter 的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42382860/

相关文章:

ios - 无法声明对泛型类的引用

ios - 事件指示器不会以相同的方法停止

ios - 使用 Grand Central Dispatch Swift 3 分配数据

swift - 从当前日期减去一定天数并以特定日期格式打印

ios - 如何将任意时间转换为 NSDate 以使用 NSDateFormatter 对其进行格式化?

ios - Xcode 5 预期标识符错误不会消失

ios - NSURLSession.sharedSession().dataTaskWithRequest(request) 最后执行

ios - 将函数转换为 Swift 3 的奇怪问题

ios - 快速更改 contactUI 'forNewContact' 的标题

ios - NSDate 表示每月的每一天