Расчет времени и даты - PullRequest
       9

Расчет времени и даты

1 голос
/ 23 октября 2019

Использование формата даты «EEEE: дд: МММ: ЧЧ: мм» возвращает правильные дату и время, однако день недели неверен. Например, рейс в 750 морских миль со скоростью 7,5 узлов займет 100 часов. Если я использую свой код для расчета времени прибытия, используя, например, пятницу 1 ноября в 12:00, он возвращается в воскресенье 5 ноября в 16:00. Время и дата правильные, а день недели - нет. Должен быть вторник.

 @IBAction func Calculate(_ sender: UIButton) {


    let userCalendar = Calendar.current

    let dateMakerFormatter = DateFormatter()

    dateMakerFormatter.dateFormat = "EEEE:dd:MMM:HH:mm"

    let distance = (Distance.text! as NSString).floatValue
    let speed = (GndSpd.text! as NSString).floatValue

    let calcDT = ((distance / speed) * 3600)


    if var date = dateMakerFormatter.date(from: (DTG.text!)) {
        date = dateMakerFormatter.date(from: (DTG.text!))!


        var timeAdj = DateComponents()
        timeAdj.second = Int(calcDT)

    if var adj = userCalendar.date(byAdding: timeAdj, to: date) {
        adj = userCalendar.date(byAdding: timeAdj, to: date)!

        CalcDTG.text = dateMakerFormatter.string(from: adj)

        }

    }
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Нельзя сказать, что день недели неправильный, если вы не даете год.

Форматер даты, похоже, игнорирует день недели при создании даты:

let dateMakerFormatter = DateFormatter()
dateMakerFormatter.dateFormat = "EEEE:dd:MMM:HH:mm" 
let date = dateMakerFormatter.date(from: "Friday:01:Nov:12:00")!
print(date) -> 2000-11-01 12:00:00 +0000    
print(dateMakerFormatter.string(from: date)) -> Wednesday:01:Nov:12:00

Эй, Presto, теперь ты в 2000 году, когда 5 ноября упал наВоскресенье. Важный вывод, который вам нужен, заключается в том, что вы никогда и никогда не должны использовать строки для передачи значений даты в вашем коде . Используйте Date. Если вы получаете дату из ответа API, измените ее на дату приема. Если вы получаете один из входа пользователя, используйте средство выбора даты или другой элемент управления. Если вы получаете одну из строк, которые вводит пользователь, я вежливо рекомендую вам сделать ненужную работу для себя, но не забудьте заполнить все детали, которые пользователь не сообщает.

0 голосов
/ 23 октября 2019

Вы должны использовать d для Дня, а не D

 dateMakerFormatter.dateFormat = "EEEE:dd:MMM:HH:mm"

DateFormatter

...