2017-01-31 88 views
0

提取日期,使用以下過於複雜的代碼的日期幾乎可以從一個字符串中提取:Swift3從自定義格式字符串

let dateStringArray:[String] = ["29-01-2017 10:41:18:825325012","29-01-2017 10:41:18:894631028"] 
let formatString = "dd-MM-yyyy HH:mm:ss:nnnnnnnnn" 
let dayRange = formatString.range(of: "dd") 
let monthRange = formatString.range(of: "MM") 
let yearRange = formatString.range(of: "yyyy") 
let hourRange = formatString.range(of: "HH") 
let minuteRange = formatString.range(of: "mm") 
let secondRange = formatString.range(of: "ss") 
let nanoRange = formatString.range(of:"nnnnnnnnn") 

let dateString = dateStringArray[0] 


let dateComponents = DateComponents(year:Int(dateString.substring(with: yearRange!)), 
            month:Int(dateString.substring(with: monthRange!)), 
            day:Int(dateString.substring(with: dayRange!)), 
            hour:Int(dateString.substring(with: hourRange!)), 
            minute:Int(dateString.substring(with: minuteRange!)), 
            second:Int(dateString.substring(with: secondRange!)), 
            nanosecond:Int(dateString.substring(with: nanoRange!))) 
let nano = Int(dateString.substring(with: nanoRange!)) 
let currentCalendar = Calendar.current 
let dateExtracted = currentCalendar.date(from: dateComponents) 
print("\(dateExtracted!)") 

從最終打印的輸出是:「2017年1月29日10 :41:18 +0000 \ n「

有問題,這(1)必須有一個更簡單的方法。 (2)&更重要的是,爲什麼納秒分量顯然不出現?

回答

1

(1)必須有一個更簡單的方法

使用日期格式:

let dateString = "29-01-2017 10:41:18:825325012" 

let dateFormatter = DateFormatter() 
dateFormatter.locale = Locale(identifier: "en_US_POSIX") 
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss:SSSSSSSS" 

let dateExtracted = dateFormatter.date(from: dateString)! 

(2)爲什麼是納秒組件顯然沒有出現?

Datedescription方法不顯示小數秒,但 你可以

currentCalendar.component(.nanosecond, from: dateExtracted!) 

再次提取它的結果可能是從原來的納秒值 字符串中略有不同,由於四捨五入錯誤,因爲Date內部存儲 浮點數(自參考日期 2001年1月1日以來的秒數)。如果您使用上述建議的日期格式化程序,那麼 的分辨率限制爲毫秒(比較NSDateFormatter milliseconds bug)。

+0

作品謝謝。如果實際精度爲毫秒,則.nanosecond的使用會引起誤解。納秒的值是從第一個實例的Date()中提取的!我在哪裏可以找到通知使用SSSSSSSSS進行秒秒的參考? – user2196409

+0

@ user2196409:http://unicode.org/reports/tr35/tr35-dates.html#dfst-second –

+0

@ user2196409:'Date'在內部表示爲浮點數(Double),因此精度有限。如果你用'「29-01-2017 10:41:18:825325014」'試試你的代碼,那麼提取的納秒仍然是'825325012'。所以你不能指望納秒總是完全保留。 (如果你需要,然後使用'DateComponents'而不是'Date')。 - 'DateFormatter'有額外的「bug」,它只能工作到毫秒。如果這是一個問題,那麼不要使用DateFormatter。 –