【问题标题】:Swift 2.1 - NSDateFormatter Weird bugSwift 2.1 - NSDateFormatter 奇怪的错误
【发布时间】:2015-11-25 07:08:27
【问题描述】:

美好的一天!我正在尝试使用 this 日期选择器对话框制作日期选择器。现在我在设置 defaultDate 选项时遇到问题,它需要 NSDate 所以我做了这个。

let date = NSDate()
let formatter1 = NSDateFormatter()
formatter1.dateFormat = "MMM dd"
formatter1.timeZone = NSTimeZone(abbreviation: "GMT")
formatter1.timeZone = NSTimeZone(forSecondsFromGMT: 28800)
let gmt8TimeZone = formatter1.stringFromDate(date)
let dateToday = formatter1.dateFromString(gmt8TimeZone)
print("\(gmt8TimeZone) - \(dateToday!)")

DatePickerDialog().show("Choose Date", doneButtonTitle: "Done", cancelButtonTitle: "Cancel", defaultDate: dateToday!, datePickerMode: UIDatePickerMode.Date) { (date) -> Void in
    self.dateSelected = date
    self.showTimePicker()
}

问题是,它不是从我设置的defaultDate 开始的,即dateToday。所以我所做的是打印日期字符串gmt8TimeZonedateToday 它给了我Nov 25 - 2000-11-24 16:00:00 +0000 为什么给我不同的日期?应该是一样的吧?我做错了什么?

【问题讨论】:

  • 从日期中提取的字符串并打印 nsdate 对象本身会给出不同的值,我猜是因为 NSDate 对象采用默认的 +0000 GMT。
  • @LEVIS OGCPAS 为什么要更改时区?
  • 用户提交的所有日期必须是从GMT+8开始,用户的手机时区不同,所以我想统一一下。
  • @LEVISOGCPAS 你不需要这样做。 NSDate 不存储时区,只使用默认的本地时间显示它

标签: swift swift2 xcode7 nsdateformatter


【解决方案1】:

只需将 NSDate() 提供给 defaultDate 参数即可。

NSDate 基本上是一个时间戳,一个固定且绝对的时间点,并且与任何 timeZone 无关:NSDate() 是绝对的,完全的,现在

当您使用 NSDateFormatter 来“修复”它时,您会离开绝对时间戳世界进入字符串世界“yyyy-mm-dd...”,这确实需要将时区解释为时间点。既然你搞砸了,你的日期就会漂移。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    相关资源
    最近更新 更多