【问题标题】:iOS UIDatePicker's date and now date early 8 hoursiOS UIDatePicker 日期和现在日期早 8 小时
【发布时间】:2018-11-03 02:21:50
【问题描述】:

有我的代码,我已经处理了时区,现在datepicker上的时间是正确的,但是datepicker上显示的时间还是错误的,使用Date()得到的当前时间也是错误的.

 @IBAction func dateChanged(_ datePicker: UIDatePicker) {
            let timeZone = NSTimeZone.system
            let interval = timeZone.secondsFromGMT(for: datePicker.date)

            let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .timeZone], from: datePicker.date.addingTimeInterval(TimeInterval(interval)))
            remindDate = Calendar.current.date(from: dateComponents)!

            print("+++++++++++++DatePicker: \(datePicker.date)++++++++++++++Date: \(remindDate)++++++++++++++Now: \(Date())+++++++++++++")

            updateDateDetial(remindDate)

        }

这是print()的结果:

+++++++++++++日期选择器:2018-05-25 02:44:33 +0000++++++++++++++++日期:2018-05- 25 10:44:00 +0000++++++++++++++++现在:2018-05-24 00:44:38 +0000+++++++++++++++

我从 datepicker 中选择的时间是 2018-05-25 10:44。现在时间应该是 2018-05-24 8:44:38。不过节目中的时间还是有差距的。

【问题讨论】:

  • 在您开始以不必要的方式操作它们之前,没有一个日期是“错误的”。选择器上显示的日期/时间是您当地的时区。如果您只是从选取器中打印日期对象,它会以 UTC 显示,因此会有一个差异,即您的本地时区和 UTC 之间的差异,但是这两个时间代表相同的 时间点
  • 查看following article 以帮助更好地理解Date

标签: ios swift timezone uidatepicker


【解决方案1】:

添加与 GMT 时间间隔偏移的代码是错误的。不要那样做。

您面临的问题是默认情况下日期以 GMT (UTC) 显示。您可以使用 DateFormatter 类方法localizedDate 为您提供当前语言环境中的日期字符串。

let datePickerDateString = DateFormatter.localizedString(from: datePicker.date,
  dateStyle: .medium,
  timeStyle, .medium)
let remindDateString = DateFormatter.localizedString(from: remindDate,
  dateStyle: .medium,
  timeStyle, .medium)
let nowString = DateFormatter.localizedString(from: Date(),
  dateStyle: .medium,
  timeStyle, .medium)
print("+++++++++++++DatePicker: \(datePickerDateString)++++++++++++++Date: \(remindDateString)++++++++++++++Now: \(nowString)+++++++++++++")

我为 Date 类创建了一个简单的扩展,使这更容易做到:

extension Date {
    func localString(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String {
        return DateFormatter.localizedString(from: self, dateStyle: dateStyle, timeStyle: timeStyle)
    }
}

这会将您的代码折叠为:

        print("+++++++++++++DatePicker: \(datePicker.date.localString())" + 
              "++++++++++++++Date: \(remindDate.localString())" + 
              "++++++++++++++Now: \(Date().localString())+++++++++++++")

编辑

如果您将日期选择器的日期安装到代码可能如下所示的标签中(使用上面的 Date 扩展)

myLabel.text = datePicker.date.localString()

(尽管请注意,当用户更改日期时,您应该将日期真正保存到实例变量中,而不是从日期选择器中获取。将模型数据保存在视图对象中是一种代码味道。)

【讨论】:

  • 我从 datepicker 得到的日期是错误的,但我在标签上显示 datepicker 的日期是正确的。如果我改变这个,那么我从 datepicker 得到的日期是正确的,但是 datepicker 的日期是错误的显示在标签上。
  • 所以编辑您的问题以显示将 datePicker 的日期放入标签的(不正确的)代码。将时间间隔偏移到 UTC 是错误的。不要那样做。
猜你喜欢
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
相关资源
最近更新 更多