在 iphone 中找不到正确的日期格式化程序 (DateFormatter)
Posted
技术标签:
【中文标题】在 iphone 中找不到正确的日期格式化程序 (DateFormatter)【英文标题】:Can't find the right date formatter (DateFormatter) in iphone 【发布时间】:2017-07-29 12:42:37 【问题描述】:我正在从服务器获取日期字符串,例如“2017-08-05T00:30:00.000+02:00”。以下是我的日期格式化程序代码。
let dateFormatter: DateFormatter = DateFormatter()
let serverDateString = "2017-08-05T00:30:00.000+02:00"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZZ"
dateFormatter.locale = Foundation.Locale(identifier: "en_US_POSIX")
let currentDate: Date = dateFormatter.date(from: serverDateString)!
但它返回 2017-08-04 22:30:00 +0000。这是错误的。有什么建议吗?
【问题讨论】:
你希望你的 dateformatter 采用哪种格式 我想让它回复我这个 2017-08-05 00:30:00 +0000 的谎言。它确实以这种格式返回我,但日期和时间不正确。现在它正在返回 2017-08-04 22:30:00 +0000。相反,它应该返回 2017-08-05 00:30:00 +0000。 使用这个nsdateformatter.com可以帮助你我认为 试试这个链接***.com/questions/41169923/…2017-08-05T00:30:00.000+02:00
和 2017-08-04 22:30:00 +0000
是在不同时区表示的同一时刻。就像伦敦的早上 7 点 (GMT+0) 是雅典的早上 9 点 (GMT+2)。你为什么期待2017-08-05 00:30:00 +0000
?您想从服务器的响应中删除时区信息吗?
【参考方案1】:
在 Swift 3 中
您可以将服务器时间字符串更改为 UTC 时间 Date
为:
let dateFormatter: DateFormatter = DateFormatter()
var serverDateString = "2017-08-05T00:30:00.000+02:00"
let index = serverDateString.index(serverDateString.startIndex, offsetBy: 19)
serverDateString = serverDateString.substring(to: index)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = TimeZone.init(identifier: "UTC")
let currentDate: Date = dateFormatter.date(from: serverDateString)!
【讨论】:
这就像一个魅力。显然我不得不忽略服务器的时间戳,你这样做了。我昨天整天都在拉头发。非常感谢。【参考方案2】:您的解析日期代码是正确的:2017-08-05T00:30:00.000+02:00
和 2017-08-04 22:30:00 +0000
代表相同的时间,只是在不同的时区。您唯一的问题是 Date
实际上并没有存储时区
【讨论】:
那么我怎样才能得到想要的结果呢? 您想更改服务器端和应用程序端,例如。服务器应该返回UTC
然后你在你的 dateFormatter 中设置时区到 UTC
【参考方案3】:
yyyy-MM-dd'T'hh:mm:ss.SSSZZZZZZ
这是您输入字符串的正确日期格式。这里是the Apple Document 以获得更多描述。
这是我的代码:
var strInputDateString: String = "2017-08-05T00:30:00.000+02:00"
var dateFormat = DateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd'T'hh:mm:ss.SSSZZZZZZ"
//Set new dateFormate
var date1: Date? = dateFormat.date(from: strInputDateString)
dateFormat.dateFormat = "dd-MM-YYYY hh:mm:ss"
// Your Desire
var strOutputDateString: String = dateFormat.string(from: date1!)
print("\(strInputDateString)")
print("\(strOutputDateString)")
输出:
Main input String:2017-08-05T00:30:00.000+02:00
Converted String: 05-08-2017 04:00:00
目前,我尝试使用我的自定义转换您的日期格式。它给了我完美的输出。
【讨论】:
这是我正在使用的,但它返回错误的日期和时间。日期应该是 2017-08-05 它返回的是 2017-08-04。那是一天前的事了。这就是问题所在。 @uzairshahzad 我发布了我用来演示项目的代码。它工作正常。 这里返回的日期没问题。但是时间不对。它应该是 00:30:00 但它返回 02:30:00 因为它会在 mytime zone 上转换。 如何防止它转换为时区?我想在从服务器获取时显示。【参考方案4】:实际上,您的代码很好。 我复制了你的数据并在操场上运行它。 你想要什么样的格式?
【讨论】:
尝试在设备上运行它。在设备上,这是我得到 2017-08-04 22:30:00 +0000 的结果。这是错误的。日期应为 2017-08-05,时间应为 12:30:00 +0000 我之前遇到过和你一样的问题,看看这个my old question 我检查了你的答案,但我已经这样做了,dateFormatter.locale = Foundation.Locale(identifier: "en_US_POSIX") 其实08-05 00:30:00 +02:00
等于-08-04 22:30:00 +00:00
。
我不熟悉日期 API,但如果您只是想获取日期,这可能对 Date(timeInterval: -7200, since: currentDate)
有所帮助。服务器返回了一个 GMT +02:00 的日期,但您需要一个 GMT +00:00 的日期,所以我只是将日期提前了 -7200 秒。【参考方案5】:
试试这个
let dateFormatter: DateFormatter = DateFormatter()
let serverDateString = "2017-08-05T00:30:00.000+02:00"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
dateFormatter.locale = Foundation.Locale(identifier: "en_US_POSIX")
let currentDate: Date = dateFormatter.date(from: serverDateString)!
希望对你有帮助
【讨论】:
它不起作用。在这种情况下,DateFormatter 会返回 nil。 还是一样。 DateFormatter 返回 nil。【参考方案6】:您缺少的步骤是再次使用 DateFormatter 将日期格式化为字符串。当您在日期上使用打印时,它将始终显示 GMT。出于说明目的,我将 TimeZone 设置为 Berlin 以匹配 +2:00 的原始偏移量。
let dateFormatter: DateFormatter = DateFormatter()
let serverDateString = "2017-08-05T00:30:00.000+02:00"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZZ"
// Hard set to Berlin
dateFormatter.timeZone = TimeZone(identifier: "Europe/Berlin")
let currentDate: Date = dateFormatter.date(from: serverDateString)!
// Your missing step
dateFormatter.string(from: currentDate)
记住 DateFormatter 是关于:
从字符串 解析 -df.date(from: String)
格式化日期 - df.string(from: Date)
【讨论】:
我不想将其转换为任何时区。它必须在从服务器接收时使用。 但是你的答案是正确的,你的种子时间是+02:00,你的输出是+00:00以上是关于在 iphone 中找不到正确的日期格式化程序 (DateFormatter)的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Boot 应用程序中找不到类型现金流的属性日期
.dylib 在 Debug 中链接,在 XCode 中找不到 iPhone 的 Release
在最新的 Xcode 版本 11.2.1 中找不到 iPhone 7、iPhone 7 Plus 和更低模式的设备 [重复]
在程序集“ProjectName.Web”中找不到 DbContext。确保您使用的是正确的程序集,并且该类型既不是抽象的也不是泛型的
在为arm64 Android手机构建应用程序包时,在ApplicationInfo.nativeLibraryDir中找不到本机库