16

代码 :

let dateString = "2016-04-02"
    var formatter: NSDateFormatter = NSDateFormatter()
    formatter.timeZone = NSTimeZone(abbreviation: "GMT +3:00")
    formatter.dateFormat = "yyyy-MM-dd"
    println("dateString: \(dateString)")
    formatter.locale =  NSLocale(localeIdentifier: "en_US_POSIX")
    let date = formatter.dateFromString(dateString)
    println("date: \(date)")

    formatter.dateFormat = "yyyy-MM-dd"
    let formattedDateString = formatter.stringFromDate(date!)
    println("formattedDateString: \(formattedDateString)")

输出 :

dateString: 2016-04-02
date: Optional(2016-04-01 21:00:00 +0000)
formattedDateString: 2016-04-02
2016-04-01 21:00:00 +0000

我正在尝试将字符串转换为 NSDate 数据类型,但没有得到正确的值。我尝试了许多解决方案,但没有返回正确的值。我需要 yyyy-MM-dd 格式(2016-04-02)与我的输入“2016-04-02”相同。如果有人可以提供帮助将非常感激。提前致谢

4

4 回答 4

18

我有同样的问题,我这对我有用

您需要设置时区

formatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")
于 2015-04-02T09:40:29.330 回答
7

当您从字符串转换为 NSDate 时,如果您没有将时区设置为格式化程序,您将获得本地时区日期的 NSDate。我想你的时区是 GMT+3 。

然后,当你显示 'date' 的值(使用 println,NSLog 而不是 NSDateFormatter)时,不设置时区,你会得到 GMT+0 时间。这就是为什么你晚了 3 个小时。

取决于如何使用 NSDateFormatter,您将拥有所需的日期字符串。在你的情况下,它返回你想要的,不是吗?

请记住,NSDate 提供了一个时刻。

let dateString = "2016-04-02"
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
println("dateString: \(dateString)")

formatter.locale =  NSLocale(localeIdentifier: "en_US_POSIX")
let date = formatter.dateFromString(dateString) //without specify timezone, your dateString "2016-04-02" is your local time (GMT-3),  
//means it's 2016-04-02 00:00:000 at GMT+0. That is the value that NSDate holds.

println("date: \(date)") //that why it show 2016-04-01 21:00:000, but not 2016-04-02 00:00:000

formatter.dateFormat = "yyyy-MM-dd"
let formattedDateString = formatter.stringFromDate(date!)
println("formattedDateString: \(formattedDateString)")
于 2015-04-02T09:10:54.843 回答
6

你的约会非常好。:-) 没有双关语。

我将详细说明@HoaParis 的回答。

首先,NSDate 代表一个时刻。它不是给定地点的日期时间值。因此,代表格林威治午夜的 NSDate 将是印度早上 5:30。

现在来回答你的问题。当您给出一个没有时间的日期格式时,格式化程序将假定它是午夜。此外,如果没有提到时区,它将采用当前时区。

因此,“2016-04-02”代表您所在时区的“2016-04-02, 00:00:00”。您的时区是 GMT+3,这意味着当您所在的地方是午夜时,它仍然是格林威治(即英国)前一天的 21:00:00 小时。

正如我们所讨论的,NSDate 是一个时刻,同一个 NSDate 对象代表这两个看似不同的时间,但实际上它们是相同的时间时刻。

默认情况下,当您打印日期时,它将打印相对于 GMT 而不是您的时区的日期,即 2016-04-01, 21:00:00。格式化程序将考虑您的时区并将其设为“2016-04-02”

于 2015-04-02T09:42:07.800 回答
5
let dateFormatter = DateFormatter()
  //Your current Date Format 
  dateFormatter.dateFormat = "yyyy-MM-dd"
  dateFormatter.locale = Locale(identifier: "en_US_POSIX")
  dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
  let finaldate = dateFormatter.date(from:"Your String")

  //Your changing Date Format 
  dateFormatter.dateFormat = "MMM-dd"
  let second = dateFormatter.string(from: finaldate!)
于 2017-01-30T11:55:42.053 回答