【问题标题】:TimeZone changed while converting string to Date将字符串转换为日期时更改时区
【发布时间】:2017-04-20 12:00:14
【问题描述】:

当我将日期(字符串形式)更改为日期形式时,时区将 IST 更改为 UTC。因此我没有收到通知

我的代码是:

@IBAction func datePickerDidSelectNewDate(_ sender: UIDatePicker) {
    let selectedDate = sender.date
    let dateStr = Date().currentTimeZoneDate(date: selectedDate as NSDate)
    let date = dateFormatter.date(from: dateStr)
    let delegate = UIApplication.shared.delegate as? AppDelegate
    delegate?.scheduleNotification(at: date!)
}

在我的代码中,我得到 selectedDate 在 UTC 时区。所以我已将其转换为 currentTimeZone。但是当我将字符串形式更改为日期时,意味着 dateStrdate 它再次转换为 UTC时区。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    currentTimeZoneDate 是什么?这似乎是对Date的深刻误解。日期从不“在一个时区”。日期是一个绝对时间点。所有观察者,无论他们身在何处,都应该就给定日期的发生时间达成一致(忽略相对论效应)。

    您应该为UIDatePicker 配置您希望它代表的时区。默认值为localTimeZone,它始终是调用此操作时的当前时区(因此sender.date 已被调整)。如果您希望它代表其他时区,请更改UIDatePicker.timeZone。不要乱搞日期。绝对不要将其转换为字符串并返回。

    目前还不清楚scheduleNotification(at:) 做了什么,或者最终目标是什么。 NSUserNotification 默认情况下,如果时区发生变化,将调整其所有交货日期。如果你不想这样(如果你想保持用户选择的精确时刻,而不是他们选择的标称时间),那么你应该在通知上设置deliveryTimeZone(通常设置为NSTimeZone.default,这是一个“当前时区”的非更新版本)。

    【讨论】:

    • 感谢您的帮助。我只是尝试实现本地通知,但默认情况下它采用 UTC 时区的 selectedDate。所以我做了所有这些事情只是为了获取当前时区。
    • selectedDate 不能是“UTC”。日期是一个绝对时间点;他们没有时区(或天、年或与日历相关的任何其他内容)。如果您的意思是用户选择的标称时间被解释为 UTC,并且您希望它是其他时间,则设置日期选择器的时区,以便它正确创建日期。但是,默认行为是日期选择器使用本地时区,所以这非常令人惊讶。
    • 一个非常常见的错误是,人们在执行print(selectedDate) 之类的操作时看到“UTC”或“+00:00”或其中的任何内容,并认为这意味着它是“在 UTC 中”。这不是真的。日期没有时区。它们只是在描述中以这种方式显示,以便于人类阅读。
    【解决方案2】:

    Swift 的 Date 类型(以及它的 Objective-C NSDate)本身没有任何 TimeZone 的概念。这只是一个简单的时间戳。这意味着,如果您将时区设置为 UIDatePicker,则无需转换即可使用该时区中的日期。

    更多解释:当您在调试器控制台中po date 时,调试器只需选择UTC 时区作为打印日期的表示。它的行为与 Date 实例无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多