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!)
代码:
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!)