2017-01-31 2 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-01-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 хранит внутренне номер с плавающей запятой (количество секунд с даты отсчета 1 января 2001 г.). Если вы используете формат даты, как было предложено выше, то разрешение ограничено миллисекундами (сравните NSDateFormatter milliseconds bug).

+0

Работы благодарности. Использование .nanosecond вводит в заблуждение, если фактическая точность составляет миллисекунды. Наносекундное значение было извлечено из Date() в первом случае! Где я могу найти ссылку, информирующую об использовании SSSSSSSSS для подсетей? – user2196409

+0

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

+0

@ user2196409: «Дата» внутренне представляется как число с плавающей запятой (Double) и поэтому имеет ограниченную точность. Если вы попробуете свой код с '" 29-01-2017 10: 41: 18: 825325014 ", то извлеченные наносекунды по-прежнему будут' 825325012'. Поэтому вы не можете ожидать, что наносекунды всегда сохраняются точно. (Если вам это нужно, используйте 'DateComponents', а не' Date'). - 'DateFormatter' имеет дополнительную« ошибку », которая работает только до миллисекунды. Если это проблема, не используйте DateFormatter. –

Смежные вопросы