Swift3 从自定义格式字符串中提取日期
Swift3 extracting a Date from a Custom Format String
使用以下过于复杂的代码几乎可以从字符串中提取日期:
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-01-29 10:41:18 +0000\n”
这里有问题 (1) 必须有更简单的方法。 (2) & 更重要的是,为什么纳秒分量显然没有出现?
(1) there must be an easier way
使用日期格式化程序:
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) why is the nanosecond component apparently not appearing?
Date
的description
方法不显示小数秒,但是
你可以用
再次提取它
currentCalendar.component(.nanosecond, from: dateExtracted!)
结果可能与原始纳秒值略有不同
由于舍入错误在字符串中,因为 Date
存储在内部
浮点数(自参考日期以来的秒数
2001 年 1 月 1 日)。如果您按照上面的建议使用日期格式化程序,那么
分辨率限制为毫秒(比较NSDateFormatter milliseconds bug)。
使用以下过于复杂的代码几乎可以从字符串中提取日期:
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-01-29 10:41:18 +0000\n”
这里有问题 (1) 必须有更简单的方法。 (2) & 更重要的是,为什么纳秒分量显然没有出现?
(1) there must be an easier way
使用日期格式化程序:
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) why is the nanosecond component apparently not appearing?
Date
的description
方法不显示小数秒,但是
你可以用
currentCalendar.component(.nanosecond, from: dateExtracted!)
结果可能与原始纳秒值略有不同
由于舍入错误在字符串中,因为 Date
存储在内部
浮点数(自参考日期以来的秒数
2001 年 1 月 1 日)。如果您按照上面的建议使用日期格式化程序,那么
分辨率限制为毫秒(比较NSDateFormatter milliseconds bug)。