Как исправить форматирование даты после добавления 30 дней к дате - PullRequest
0 голосов
/ 23 декабря 2018

Я получаю дату и время в разных строках и собираю их вместе в формате даты с использованием средства форматирования даты.После этого я добавляю 30 дней к приведенной дате.Теперь я пытаюсь снова использовать dateFormatter, но что бы я ни делал, это приведет к нулю (хотя это не ноль).Что я делаю неправильно?

 //GET TIME AND DATE FROM TWO STRINGS
    var timeStarting = "10:50"
    var dateStarting = "03/10/2016"
    let date = Date()
    let timeStamp = NSDate().timeIntervalSince1970
    let dateFormater = DateFormatter()
    dateFormater.dateStyle = .short
    dateFormater.timeStyle = .none
    dateFormater.dateFormat = "dd/MM/yyyy HH:mm"
    var timeAndDate = "\(dateStarting) \(timeStarting)"
    let endingDate : Date = dateFormater.date(from: "\(timeAndDate)")!

    //ADD 30 DAYS TO ENDING DATE
    var numberOfDays = "30"
    let thirtyDaysBeforeToday = Calendar.current.date(byAdding: .day, value: Int(numberOfDays)!, to: endingDate)
    var stringFromThityDaysBefore : String = "\(thirtyDaysBeforeToday!)"

    //FORMAT AGAIN TO SHOW THE DATE IN AS (EX.: 13.10.2016)
    let dateFormater2 = DateFormatter()
    dateFormater2.isLenient = true
    dateFormater2.dateStyle = .short
    dateFormater2.timeStyle = .none
    dateFormater2.dateFormat = "dd.MM.yy"
    var newDates : Date = dateFormater2.date(from: "\(stringFromThityDaysBefore)")!

(РЕЗУЛЬТАТ ЕХ: 13.10.2016) - С 30 ДНЯМИ ПОСЛЕ КОНЕЧНОЙ ДАТЫ

1 Ответ

0 голосов
/ 23 декабря 2018

Здесь много проблем и много ненужного кода.

  1. Используйте специальный языковой стандарт en_US_POSIX при разборе строки даты в фиксированном формате.
  2. Вам не нужно stringFromThityDaysBefore.Ваш thirtyDaysBeforeToday уже через Date 30 дней после endingDate.
  3. Не устанавливайте dateFormat и date/timeStyle для форматера даты.Устанавливайте только одно или другое.
  4. В конце вы хотите новую строку, представляющую новую дату, которая наступает через 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.Всегда лучше использовать стиль для любой даты, которую вы хотите отобразить пользователю.Это гарантирует, что он лучше отформатирован для локали пользователя.

...