我正在更新问题以使其更精确,感谢您的反馈。
所以我设置一个单元格的tableview和显示单元格本身的事件的时间,这样做我使用解析。正如第一个println所证明的那样,从parse下载的日期是正确的,但是当我使标签文本等于when日期的dateToString(这是来自parse的日期)时,由于某种原因,它会抛出几个小时。然而,模拟器在状态栏上显示正确的时间,手机的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等)要复杂得多。有时候我希望苹果能创建一个NSDate
类来添加&减去日期/时间组件,切换时区等。
看一下NSDateFormatter和它是如何工作的。如果我清楚地理解了你的问题,我想这应该可以工作。
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm"
dateFormatter.stringFromDate(parseDateObject)
2015-05-31 23:43:00 +0000
表示" 2015年5月31日23:43:00 at +0000 from UTC"。
根据你的问题"模拟器在状态栏上显示正确的时间,手机的gps设置为EST"。
如果将该日期从UTC转换为EST,则得到"Sunday, 7:43 PM"。
您的NSDate
因此被完美地解释。
对Parse API做合理的假设,看起来有人错误地导入了你的数据