我正在尝试解析一些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"
和
"Time_Complete":"2015-04-09T19:37:56"
我们可以看到,一个有毫秒时间戳,另一个没有。
通过查看数据库,发生这种情况是因为数据库(MS SQL Server)中毫秒实际上是.000,无论出于何种原因,我在json中收到的结果都会截断此部分。
我对毫秒不感兴趣,但我希望有一个可以处理这两种情况的dateFormat函数。
现在我有一个明显的答案是(pre)解析每个日期字段,如果它们在那里则删除毫秒,然后使用以下代码格式化它们:
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"
和
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
并自动正确地进行格式化。
我一直在检查这个问题,但在那里找不到任何东西,提前谢谢......
答案 0 :(得分:3)
extension String {
var toDate : NSDate? {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
if let date = formatter.dateFromString(self) {
return date
} else {
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
if let date = formatter.dateFromString(self) {
return date
}
}
return nil
}
}
"2015-04-08T19:37:56.913".toDate // "Apr 8, 2015, 4:37 PM"
"2015-04-09T19:37:56".toDate // "Apr 9, 2015, 4:37 PM"
答案 1 :(得分:2)
不,如果字符串不在指定的确切日期格式中,则NSDateFormatter
将返回nil。
你可以做什么而不是预处理字符串,只是检查你得到的字符串是否有毫秒或没有。
执行此操作的最佳方法是使用Regex。我的想法是像你一样正常创建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"
}