web-dev-qa-db-fra.com

Obtenez la différence de temps entre deux fois en Swift 3

J'ai 2 variables où je reçois 2 fois de datePicker et je dois enregistrer sur une variable la différence entre elles.

    let timeFormatter = DateFormatter()
    timeFormatter.dateFormat = "HHmm"

    time2 = timeFormatter.date(from: timeFormatter.string(from: datePicker.date))!

J'ai essayé d'obtenir le timeIntervalSince1970 d'eux et d'eux de les soustraire et d'obtenir la différence en millisecondes que je reviendrai en heures et minutes, mais j'obtiens un très grand nombre qui ne correspond pas à l'heure réelle.

let dateTest = time2.timeIntervalSince1970 - time1.timeIntervalSince1970

Ensuite, j'ai essayé d'utiliser time2.timeIntervalSince (date: time1), mais encore une fois, les millisecondes résultantes sont beaucoup plus que l'heure réelle.

Comment puis-je obtenir le décalage horaire correct entre 2 fois et obtenir le résultat en heures et minutes au format "0823" pendant 8 heures et 23 minutes?

7
ToroLoco

La méthode recommandée pour effectuer des calculs de date est Calendar et DateComponents

let difference = Calendar.current.dateComponents([.hour, .minute], from: time1, to: time2)
let formattedString = String(format: "%02ld%02ld", difference.hour!, difference.minute!)
print(formattedString)

Le format %02ld Ajoute le zéro de remplissage.

Si vous avez besoin d'un format standard avec deux points entre les heures et les minutes DateComponentsFormatter() pourrait être un moyen plus pratique

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute]
print(formatter.string(from: time1, to: time2)!)
14
vadian

TimeInterval mesure les secondes, pas les millisecondes:

let date1 = Date()
let date2 = Date(timeIntervalSinceNow: 12600) // 3:30

let diff = Int(date2.timeIntervalSince1970 - date1.timeIntervalSince1970)

let hours = diff / 3600
let minutes = (diff - hours * 3600) / 60
10
Gereon

Pour obtenir la durée en secondes entre deux intervalles de temps, cela peut être utilisé -

let time1 = Date(timeIntervalSince1970: startTime)
let time2 = Date(timeIntervalSince1970: endTime)
let difference = Calendar.current.dateComponents([.second], from: time1, to: time2)
let duration = difference.second
2
Namit Gupta

Vous pouvez maintenant le faire en Swift 5 de cette façon,

func getDateDiff(start: Date, end: Date) -> Seconds  {
    let calendar = Calendar.current
    let dateComponents = calendar.dateComponents([Calendar.Component.second], from: start, to: end)

    let seconds = dateComponents.second
    return Seconds(seconds!)
}
2
cary