Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSDate在几个小时后被解释(分钟和一天的工作时间)_Ios_Swift_Nsdate - Fatal编程技术网

Ios NSDate在几个小时后被解释(分钟和一天的工作时间)

Ios NSDate在几个小时后被解释(分钟和一天的工作时间),ios,swift,nsdate,Ios,Swift,Nsdate,我正在更新问题,使其更加准确,感谢您的反馈 因此,我正在为tableview设置一个单元格,并在单元格上显示事件的时间,为此,我使用了Parse。正如第一个println所证明的那样,日期是从parse正确下载的,但是当我使标签文本等于when日期的dateToString(这是来自parse的日期)时,出于某种原因,它会将其抛出几个小时。然而,模拟器在状态栏上显示正确的时间,手机gps也设置为EST。。。所以我很困惑 以下是整个功能: func configureCell(object : P

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

因此,我正在为tableview设置一个单元格,并在单元格上显示事件的时间,为此,我使用了Parse。正如第一个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,UTC+0000”

根据您的问题“模拟器在状态栏上显示正确的时间,手机gps设置为EST”

如果您将该日期从UTC转换为EST,则会得到“星期日下午7:43”

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


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

用您尝试的内容更新您的问题,并解释您得到的内容和实际需要的内容。什么是“放弃nsdateformatter的日期到字符串方法”是什么意思?嗨,我更新了我的问题,试图更好地澄清我的目的。我最初询问如何截断NSDate对象的原因是,我认为它可以解决我的问题,但在尝试了NSCalendar组件解决方案后,我不再认为是这样。您好,谢谢您的帮助,它可以创建一个新的日期对象,将秒设置为零,但不幸的是,我意识到它并没有解决我的实际问题。我更新了我的问题以更好地反映它。我为我的问题措词不当而道歉。哇,这么简单的东西。。。非常感谢。您知道当用户使用datepicker对象时,是否有方法获取用户的时区,以便我可以创建一个新的日期提交以进行分析,该日期调整为UTC,然后在用户在单元格中查看时可以重新解释回时区?您可以使用
let timezone=NSTimeZone.localTimeZone()获取本地时区
UIDatePicker
应返回根据系统时区调整的日期*;你确定你和Parse之间没有发生什么奇怪的事吗。(*他们仍将
println
以UTC为单位;日期是什么以及如何打印日期是两个独立的问题——在苹果的术语中,日期是某一时刻的标识符,世界上每个人都会同时体验到这一点,而不管墙上的时钟上显示的数字是什么)