Здесь много проблем и много ненужного кода.
- Используйте специальный языковой стандарт en_US_POSIX при разборе строки даты в фиксированном формате.
- Вам не нужно
stringFromThityDaysBefore
.Ваш thirtyDaysBeforeToday
уже через Date
30 дней после endingDate
. - Не устанавливайте
dateFormat
и date/timeStyle
для форматера даты.Устанавливайте только одно или другое. - В конце вы хотите новую строку, представляющую новую дату, которая наступает через 30 дней.Ваш код завершается ошибкой, потому что вы преобразуете
Date
в String
с использованием интерполяции строк, а затем пытаетесь проанализировать эту строку с помощью вашего второго устройства форматирования даты.
Вот фиксированный код:
let timeStarting = "10:50"
let dateStarting = "03/10/2016"
let dateFormater = DateFormatter()
dateFormater.dateFormat = "dd/MM/yyyy HH:mm"
dateFormater.locale = Locale(identifier: "en_US_POSIX")
let timeAndDate = "\(dateStarting) \(timeStarting)"
let endingDate = dateFormater.date(from: timeAndDate)!
//ADD 30 DAYS TO ENDING DATE
let numberOfDays = 30
let thirtyDaysAfter = Calendar.current.date(byAdding: .day, value: numberOfDays, to: endingDate)!
//FORMAT AGAIN TO SHOW THE DATE IN AS (EX.: 13.10.2016)
let dateFormater2 = DateFormatter()
dateFormater2.dateFormat = "dd.MM.yy"
let newDateString = dateFormater2.string(from: thirtyDaysAfter)
Результат дает 02.11.16
для newDateString
.
И последнее, что нужно учитывать - не используйте dateFormat
во втором форматере даты.Используйте date/timeStyle
.Всегда лучше использовать стиль для любой даты, которую вы хотите отобразить пользователю.Это гарантирует, что он лучше отформатирован для локали пользователя.