Ios 变量日期类型字符串的Swift dateFormat
我试图解析一些json,这是oData连接的结果,我从服务器得到以下响应:Ios 变量日期类型字符串的Swift dateFormat,ios,json,swift,odata,nsdateformatter,Ios,Json,Swift,Odata,Nsdateformatter,我试图解析一些json,这是oData连接的结果,我从服务器得到以下响应: "Task_ID":24,"Equipment_ID":3,"Owner_ID":2,"Priority":5,"Date_Due": "2015-04-08T19:37:56.913","Time_Complete":"2015-04-09T19:37:56","Task_Description" 实际上,我对收到的两个不同的日期字段很感兴趣: "Date_Due":"2015-04-08T19:37:56.913"
"Task_ID":24,"Equipment_ID":3,"Owner_ID":2,"Priority":5,"Date_Due":
"2015-04-08T19:37:56.913","Time_Complete":"2015-04-09T19:37:56","Task_Description"
实际上,我对收到的两个不同的日期字段很感兴趣:
"Date_Due":"2015-04-08T19:37:56.913"
及
我们可以看到,一个有毫秒时间戳,另一个没有
通过查看数据库,这是因为毫秒实际上是数据库(MS SQL Server)中的.000,无论出于何种原因,我在json中收到的结果都会截断这一部分
我对毫秒不感兴趣,但我希望有一个dateFormat函数可以处理这两种情况
现在我有了一个明显的答案,即(预)解析每个日期字段,删除毫秒(如果有),然后使用以下代码格式化它们:
let SQLDateFormatter: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
return formatter
}()
但是,我想知道我们是否可以构建一个无需预解析即可解决此问题的格式化程序,该格式化程序可以同时处理以下两种情况:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
及
并自动正确地进行格式化
我一直在检查此问题,但在那里找不到任何内容,提前感谢…否,
NSDateFormatter
如果字符串不是指定的确切日期格式,将返回nil
您可以做的不是预处理字符串,而是检查您得到的字符串是否有毫秒
最好的方法是使用正则表达式。其思想是像您平常一样创建SQLDateFormatter,然后检查字符串是否有毫秒。如果包含毫秒,只需更改dateFormat,这比解析字符串要好
if let match = tes.rangeOfString("(\\d{4}-\\d\\d-\\d\\d[T](\\d\\d:){2}\\d\\d.\\d{3})", options: NSStringCompareOptions.RegularExpressionSearch)
{
SQLDateFormatter.format = "yyyy-MM-dd'T'HH:mm:ss.SSS"
}
完美,这正是我想要的,没有考虑过测试零回报率,然后尝试第二种选择。明亮的谢谢你的回答!您应该缓存格式化程序,格式化程序的创建和配置速度非常慢:in可能会在表滚动期间造成明显的延迟,或将json解析时间增加一两秒。这是一个4年前的(Swift 1.x)回答,也是一个很好的答案,与我之前所做的类似,但使用的正则表达式可能快得多。投票通过了!谢谢你的回答!
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
if let match = tes.rangeOfString("(\\d{4}-\\d\\d-\\d\\d[T](\\d\\d:){2}\\d\\d.\\d{3})", options: NSStringCompareOptions.RegularExpressionSearch)
{
SQLDateFormatter.format = "yyyy-MM-dd'T'HH:mm:ss.SSS"
}
extension Formatter {
static let iso8601: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
return formatter
}()
static let iso8601withFractionalSeconds: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
return formatter
}()
}
extension String {
var date: Date? {
return Formatter.iso8601withFractionalSeconds.date(from: self) ??
Formatter.iso8601.date(from: self)
}
}
"2015-04-08T19:37:56.913".date // "Apr 8, 2015, 4:37 PM"
"2015-04-09T19:37:56".date // "Apr 9, 2015, 4:37 PM"