【问题标题】:Convert UTC NSDate into Local NSDate not working将 UTC NSDate 转换为本地 NSDate 不起作用
【发布时间】:2016-11-05 13:02:37
【问题描述】:

我有一个字符串从服务器获取为"yyyy-MM-dd'T'HH:mm:ss.SSS'Z" 我通过这个格式把这个字符串转换成 NSDate。

class func convertUTCDateToLocateDate(dateStr:String) -> NSDate{
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
        dateFormatter.timeZone = NSTimeZone(name: "UTC")
        let date = dateFormatter.dateFromString(dateStr)


    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z"
    dateFormatter.timeZone = NSTimeZone.localTimeZone()
    let timeStamp = dateFormatter.stringFromDate(date!)
    let dateForm = NSDateFormatter()
    dateForm.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    dateForm.timeZone = NSTimeZone.localTimeZone()
    let dateObj = dateForm.dateFromString(timeStamp)
    return dateObj!
}

假设参数字符串是“2016-11-05T12:00:00.000Z”但是当我转换这个字符串并返回一个NSDate对象时,它不会根据我的当地时间改变时间。我在timeStamp 字符串中得到了正确的时间(在上面的代码中)。但是当我尝试将 timeStamp 字符串转换为 NSDate 时,它​​再次显示我作为参数获得的日期和时间。

【问题讨论】:

  • 不要在您的日期格式中引用Z。您不想要文字 Z。您希望将其正确视为时区。

标签: ios swift nsdate nsdateformatter


【解决方案1】:

您不应该更改 NSDate 的时间。 NSDates 只是一个时间点,以秒为单位。他们不知道时区、天、月、年、小时、分钟、秒……如果直接打印,他们将始终以 UTC 格式输出时间。
如果您更改日期以显示您所在时区的时间,那么您实际上是在更改 UTC 时间 - 因此,无论时区如何,您的日期都代表另一个时间点。
通过不更改它们来保持它们的完整性,而是在需要显示它们时通过日期格式化程序进行。
如果您需要进行独立于时区的时间计算,您也可以使用 NSDateComponents。

【讨论】:

  • 能否请您引用一个使用 NSDateComponent 计算时间的示例。例如,将 45 分钟添加到 11:33 PM,我们如何将其转换为 12:18 AM
  • 每个组件(年、月、日、小时、分钟……)都是整数类型。只需添加它们。
【解决方案2】:

NSDate 没有时区。这是一个时间点,独立于任何事物,尤其是时区。您不能“将 UTC NSDate 转换为本地 NSDate”,该语句本身没有任何意义。

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 2015-06-06
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多