Используя следующий слишком сложный код дата может быть почти извлеченное из строки: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-01-29 10 : 41: 18 +0000 \ n "
Есть проблемы с этим (1) должен быть более простой способ. (2) & более важно, почему наносекундный компонент, по-видимому, не появляется?
Работы благодарности. Использование .nanosecond вводит в заблуждение, если фактическая точность составляет миллисекунды. Наносекундное значение было извлечено из Date() в первом случае! Где я могу найти ссылку, информирующую об использовании SSSSSSSSS для подсетей? – user2196409
@ user2196409: http://unicode.org/reports/tr35/tr35-dates.html#dfst-second –
@ user2196409: «Дата» внутренне представляется как число с плавающей запятой (Double) и поэтому имеет ограниченную точность. Если вы попробуете свой код с '" 29-01-2017 10: 41: 18: 825325014 ", то извлеченные наносекунды по-прежнему будут' 825325012'. Поэтому вы не можете ожидать, что наносекунды всегда сохраняются точно. (Если вам это нужно, используйте 'DateComponents', а не' Date'). - 'DateFormatter' имеет дополнительную« ошибку », которая работает только до миллисекунды. Если это проблема, не используйте DateFormatter. –