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

时间:2015-06-01 21:13:18

标签: ios swift nsdate

我正在更新问题更准确,谢谢您的反馈意见。

所以我正在为一个tableview设置一个单元格,并在单元格本身上显示事件的时间,并使用Parse。正如第一个println所证明的那样,日期正在从解析中正确下载,但是当我使标签文本等于when日期的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在当前日期正常工作。

提前感谢您的帮助!!

3 个答案:

答案 0 :(得分:0)

修改:根据新的详细信息更新答案。

你的麻烦是因为时区。 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类,其中包含添加&的方法。减去日期/时间组件,切换时区等。我可以梦想。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

2015-05-31 23:43:00 +0000表示" 2015年5月31日23:43:00距离UTC +#34; +。

根据你的问题"然而,模拟器在状态栏上显示正确的时间,并且手机gps设置为EST"。

如果您将该日期从UTC转换为EST,则会在周日,晚上7:43和#34;#。

您的NSDate因此被完美解读。

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