Пытаюсь посчитать разницу во времени, но получаю отрицательный ответ - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь рассчитать разницу во времени (х ч х мин) между двумя временами, текущим временем и временем, установленным пользователем с помощью таймера.

Я бы получил отрицательное значение, например, -7 часов 30 минут.

Чтобы решить эту проблему, я прочитал, что мне нужно будет включить утверждение if. Тем не менее, я получаю следующую ошибку и не могу ее решить: «Не удалось преобразовать значение типа« Дата »в ожидаемый тип аргумента« TimeInterval »(он же« Double »)»

был бы очень признателен за помощь, спасибо!

func findTimeDiff() {
    let time1 = currentTimeOutlet
    let time2 = alarmTimeOutlet

    let formatter = DateFormatter()
    formatter.dateFormat = "hh:mma"

    let date1 = formatter.date(from: time1!.text!)
    let date2 = formatter.date(from: time2!.text!)

    var elapsedTime = date2!.timeIntervalSince(date1!)
    let hours = floor(elapsedTime / 60 / 60)
    let minutes = floor((elapsedTime - (hours * 60 * 60)) / 60)

    if (date2!) < (date1!) {

        var elapsedTime = ((date2! + 86400000) - date1!)
        let hours = floor(elapsedTime / 60 / 60)
        let minutes = floor((elapsedTime - (hours * 60 * 60)) / 60)
        timeDiffOutlet.text = ("\(Int(hours)) hr and \(Int(minutes)) min")
    }
    else {
        var elapsedTime = date2!.timeIntervalSince(date1!)
        let hours = floor(elapsedTime / 60 / 60)
        let minutes = floor((elapsedTime - (hours * 60 * 60)) / 60)
        timeDiffOutlet.text = ("\(Int(hours)) hr and \(Int(minutes)) min")

    }
}

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Вы должны избегать выполнения расчетов с жестко закодированными значениями, такими как эта, где важны даты и время.Вместо этого гораздо лучше использовать методы, предоставляемые вам классом Calendar.

Так что-то вроде этого:

func findTimeDiff2() {
    let time1 = currentTimeOutlet
    let time2 = alarmTimeOutlet

    let formatter = DateFormatter()
    formatter.dateFormat = "hh:mma"

    let date1 = formatter.date(from: time1!.text!)
    let date2 = formatter.date(from: time2!.text!)

    let components = Calendar.current.dateComponents([.hour, .minute], from: date1!, to: date2!)

    timeDiffOutlet.text = "\(abs(components.hour!)) hr and \(abs(components.minute!)) min"
}

Это означает, что такие ситуации, как переход на летнее время, будутдля вас, хотя в этом случае вы не знаете день, когда происходит сигнал тревоги, вы не сможете узнать, применяется ли переход на летнее время или нет.Было бы лучше использовать полную дату, а не только время.

0 голосов
/ 23 марта 2019

Почему вы пытаетесь использовать совершенно другое выражение в случае (date2!) < (date1!)?

Попробуйте изменить эту строку:

var elapsedTime = ((date2! + 86400000) - date1!)

На:

var elapsedTime = date1!.timeIntervalSince(date2!)
...