NSDateFormatter return 错误日期 + Swift

NSDateFormatter return wrong date + Swift

代码:

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”相同。如果有人能提供帮助,我们将不胜感激。提前致谢

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

然后,当你显示 'date' 的值时(使用 println、NSLog 而不是 NSDateFormatter),在不设置时区的情况下,你将获得 GMT+0 时间。这就是为什么你在 3 小时后得到的原因。

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

请记住 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)")

我遇到了同样的问题,这对我有用

您需要设置时区

formatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")

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

我将详细说明@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”

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!)