NSDateFormatter返回错误的日期+ Swift

San*_*mar 11 nsdate nsdateformatter string-to-datetime 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)")
Run Code Online (Sandbox Code Playgroud)

输出:

dateString: 2016-04-02
date: Optional(2016-04-01 21:00:00 +0000)
formattedDateString: 2016-04-02
2016-04-01 21:00:00 +0000
Run Code Online (Sandbox Code Playgroud)

我试图将字符串转换为NSDate数据类型,但没有得到正确的值.我尝试了很多解决方案,但它没有返回正确的值.我需要yyyy-MM-dd格式(2016-04-02)与我的输入"2016-04-02"相同.如果有人可以提供帮助,那将是真正的帮助.提前致谢

Chr*_*cou 15

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

您需要设置时区

formatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")
Run Code Online (Sandbox Code Playgroud)

  • 现在我得到正确答案 - NSTimeZone(缩写:"UTC").谢谢你们 (5认同)

Duy*_*Hoa 5

当您从字符串转换为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)")
Run Code Online (Sandbox Code Playgroud)


Abd*_*lah 5

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

我将详细介绍@HoaParis的答案.

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

现在回答你的问题.当你给出一个没有时间的日期格式时,格式化程序会认为它是半夜.此外,如果没有提到时区,它将采用当前时区.

因此'2016-04-02'代表您所在时区的'2016-04-02,00:00:00'.您的时区是格林威治标准时间+3,这意味着当您在您的地方午夜时,它仍然是前一天在格林威治即英国的21:00:00.

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

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


MK_*_*iOS 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!)
Run Code Online (Sandbox Code Playgroud)