NSDate 被解释几个小时(几分钟和一天工作正常)

NSDate being interpreted several hours off (minutes and day working fine)

我正在更新问题以使其更准确,感谢您的反馈。

所以我正在为 tableview 设置一个单元格,并在单元格本身上显示事件的时间,为此我使用了 Parse。正如第一个 println 所证明的那样,日期是从解析中正确下载的,但是当我使标签文本等于日期的 dateToString 时(这是来自解析的日期),由于某种原因,它会在几个小时后抛出它。然而,模拟器在状态栏上显示正确的时间,手机 gps 也设置为 EST...所以我很困惑。

这是整个函数:

func configureCell(object : PFObject)-> Void {

    eventNameText.text = (object.objectForKey("name") as? String)!
    var when = (object.objectForKey("when") as? NSDate)!
    numEchoesText.text = String(stringInterpolationSegment: object.objectForKey("numEchoes")!)

    println(when)

    var formatter = NSDateFormatter()
    formatter.dateFormat =  "EEEE, h:mm a"

    parseid = object.objectId!

    if (contains(echoes, parseid)) {
        echoImage.setImage(imageEchoed, forState: .Normal)
    }

    else {
        echoImage.setImage(imageUnechoed, forState: .Normal)
    }
    var now = NSDate()


    whenText.text = formatter.stringFromDate(when)
    println(formatter.stringFromDate(now))
    println(formatter.stringFromDate(when))
    self.object = object
}

结果如下:

2015-05-31 23:43:00 +0000
Tuesday, 9:30 AM
Sunday, 7:43 PM

请注意,第一个时间是正确的,但 datetostring 将其解释为第三行。我添加了一个中间的 println 来显示当前日期,以表明 datetostring 对于现在的日期是否正常工作。

在此先感谢您的帮助!!

编辑: 根据新的详细信息更新了答案。

你的麻烦是因为时区。 NSDate 不存储任何时区信息。

println(when)
--> 2015-05-31 23:43:00 +0000   // notice the timezone is 0000 / GMT

NSDateFormatter 添加时区将帮助您了解幕后发生的事情:

var formatter = NSDateFormatter()
formatter.dateFormat =  "EEEE, h:mm a z"
println(formatter.stringFromDate(when))
--> Sunday, 7:43 PM xyz    // Depends on the timezone on your device

两者代表相同的时间点,但在不同的时区表示。要解决这个问题,您需要将格式化程序的时区设置为 GMT:

var formatter = NSDateFormatter()
formatter.dateFormat = "EEEE, h:mm a z"
formatter.timeZone   = NSTimeZone.init(name:"GMT")
println(formatter.stringFromDate(when))
--> Sunday, 11:43 PM GMT

现在您可以删除时区标识符了。 Cocoa / iOS 中的日期和时间操作比其他语言(Java、C#、Javascript 等)复杂得多。有时我希望 Apple 只是创建一个NSDate class 具有加减 date/time 组件、切换时区等方法。我可以梦想。

看看 NSDateFormatter 及其工作原理。如果我清楚地理解你的问题,我认为这应该可行。

    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd hh:mm"
    dateFormatter.stringFromDate(parseDateObject)

2015-05-31 23:43:00 +0000 表示 "the 31st of May 2015 at 23:43:00 at +0000 from UTC".

根据你的问题"The simulator however displays the right time on the status bar and the phones gps is set to EST"。

如果将该日期从 UTC 转换为 EST,您将得到 "Sunday, 7:43 PM"。

因此,您的 NSDate 得到了完美的解释。

对 Parse 做出合理假设 API,看来有人错误地导入了您的数据。