【问题标题】:NSDate being interpreted several hours off (minutes and day working fine)NSDate 被解释几个小时(几分钟和一天工作正常)
【发布时间】:2015-08-15 11:55:02
【问题描述】:

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

所以我正在为表格视图设置一个单元格,并在单元格本身上显示事件的时间,并使用 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 对于当前日期正常工作。

提前感谢您的帮助!

【问题讨论】:

  • 用你尝试过的内容更新你的问题,并解释你得到了什么以及你真正想要什么。
  • 抛出 nsdateformatter 的日期转字符串方法”是什么意思?
  • 您好,我更新了我的问题,试图更好地阐明我的目标。我最初询问如何截断 NSDate 对象的原因是我认为它可以解决我的问题,但在尝试了 NSCalendar 组件解决方案后我不再相信这种情况。

标签: ios swift nsdate


【解决方案1】:

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

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

【讨论】:

  • 您好,谢谢您,它可以创建一个秒设置为零的新日期对象,但不幸的是我意识到它并没有解决我的实际问题。我更新了我的问题以更好地反映它。对于我的问题措辞不佳,我深表歉意。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    2015-05-31 23:43:00 +0000 表示“UTC 时间 2015 年 5 月 31 日 23:43:00 +0000”。

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

    如果您将该日期从 UTC 转换为 EST,您会得到“星期日,晚上 7:43”。

    因此您的NSDate 被完美解读。

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

    【讨论】:

    • 哇,这么简单...谢谢!您知道是否有办法在用户使用 datepicker 对象时获取用户的时区,以便我可以创建一个新日期以提交以调整为 UTC 的解析,然后在用户查看时重新解释为时区细胞?
    • 您可以通过let timezone = NSTimeZone.localTimeZone()获取当地时区
    • UIDatePicker 应该返回根据系统时区调整的日期*;你确定你和 Parse 之间没有发生什么奇怪的事情吗? (* 他们仍然会在 UTC 中使用println;日期是什么以及如何打印日期是不同的问题——在 Apple 的术语中,日期是某个时刻的标识符,世界上的每个人都同时经历过他们的挂钟上显示的数字是什么)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2017-09-22
    • 2017-06-08
    • 1970-01-01
    • 2021-06-26
    • 2014-07-14
    相关资源
    最近更新 更多