【问题标题】:Cannot change the timezone for DateFormatter in Swift 3无法在 Swift 3 中更改 DateFormatter 的时区
【发布时间】:2017-07-11 23:49:54
【问题描述】:

我刚刚将我的应用程序代码迁移到 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 返回 2017-02-21 13:00:00 +0000 即一天过去,我需要 date1 是 2017-02-22 仅供参考,我在澳大利亚进行这项开发。

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

我已经尝试为 DateFormatter 设置 TimeZone 和 Locale,

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

Converting date between timezones swift

等等。关于如何达到我想要的结果的任何想法?这段代码在 Swift 之前工作得很好。

【问题讨论】:

  • 为什么你认为你的问题的前 4 行代码有什么问题?很好,很正确。
  • 澳大利亚 2 月 22 日午夜是 UTC 时间 21 日 13:00。没有错。
  • 很公平!我已编辑问题以使问题更清楚。
  • 同样,您的代码没有任何问题。唯一的困惑是您对打印/记录Date 对象的输出的理解。话虽如此,您的日期字符串正在用户的本地时间进行处理。如果您希望将日期字符串作为 UTC 时间或其他特定时区处理,则需要根据需要设置日期格式化程序的时区。但是如果当地时间是正确的,那么你的代码就是正确的。
  • 好的,所以问题是我需要一个 2017-02-22 的 (NS) Date() 对象,这样我就可以根据它做一些处理应用程序逻辑。使用我粘贴的代码,我没有得到。所以基本上想要一个带有 2017-02-22 的 Date() 对象。我不能得到那个?我认为使用 Calendar.current.date(from: components) 可以帮助我做到这一点,但这也不成功?

标签: ios swift3 nsdateformatter nstimezone dateformatter


【解决方案1】:

正如 maddy 在 cmets 中指出的那样,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)运行此代码 - 因此,当我将 2017 年 2 月 22 日转换为日期时,它存储为 2017 年 2 月 21 日 UTZ,但如果我将其返回使用我的语言环境中的 DateFormatter,我得到了 2017 年 2 月 22 日午夜。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多