Comment ajouter des minutes à l'heure actuelle dans Swift


109

Je suis nouveau sur Swift et j'essaie un planificateur. J'ai sélectionné l'heure de début et je dois ajouter 5 minutes (ou des multiples de celle-ci) à l'heure de début et l'afficher dans un UILabel?

    @IBAction func timePickerClicked(sender: UIDatePicker) {
    var dateFormatter = NSDateFormatter()
    dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
    var dateStr = dateFormatter.stringFromDate(startTime.date)
    let sttime = dateStr
    startTimeDisplay.text = dateStr
    }

   // How to advance time by 5 minutes for each section based on the   start time selected and display time 
   // section 1 = start time + 5
   // section 2 = start time + 10*

Réponses:


271

Deux approches:

  1. Utilisez Calendaret date(byAdding:to:wrappingComponents:). Par exemple, dans Swift 3 et versions ultérieures:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. Utilisez simplement l' +opérateur (voir +(_:_:)) pour ajouter un TimeInterval(c'est-à-dire un certain nombre de secondes). Par exemple, pour ajouter cinq minutes, vous pouvez:

    let date = startDate + 5 * 60

    (Remarque, l'ordre est spécifique ici: la date sur le côté gauche du +et les secondes sur le côté droit.)

    Vous pouvez également utiliser addingTimeInterval, si vous préférez:

    let date = startDate.addingTimeInterval(5 * 60)

En bout de ligne, +/ addingTimeIntervalest plus facile pour les scénarios simples, mais si vous souhaitez ajouter des unités plus grandes (par exemple, des jours, des mois, etc.), vous voudrez probablement utiliser les calculs calendaires car ceux-ci s'ajustent à l'heure d'été, alors que ce addingTimeIntervaln'est pas le cas. .


Pour les rendus Swift 2, consultez la révision précédente de cette réponse .


Laquelle de ces 2 approches est la plus performante? ajoutantTimeInterval ou calendar.date (byAdding ...
Nishant

3
Le addingTimeIntervalest sans aucun doute plus performant (mais probablement pas important à moins que vous ne le fassiez des millions de fois). Ce qui est plus important, cependant, c'est que si vous parlez d'unités de mesure en jours (ou plus), le rendu calendaire est préférable car il effectuera tous les ajustements d'heure d'été pour vous.
Rob

40

Vous pouvez utiliser la méthode de Calendar

func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date?

pour en ajouter Calendar.Componentà tout Date. Vous pouvez créer une extension de date pour ajouter x minutes à votre UIDatePickerdate:

Xcode 8 et Xcode 9 • Swift 3.0 et Swift 4.0

extension Date {
    func adding(minutes: Int) -> Date {
        return Calendar.current.date(byAdding: .minute, value: minutes, to: self)!
    }
}

Ensuite, vous pouvez simplement utiliser la méthode d'extension pour ajouter des minutes à l'expéditeur (UIDatePicker):

let section1 = sender.date.adding(minutes: 5)
let section2 = sender.date.adding(minutes: 10)

Test de terrain de jeu:

Date().adding(minutes: 10)  //  "Jun 14, 2016, 5:31 PM"

Dans quelles circonstances .date(byAdding:value:to)revient-il nil? Sommes-nous sûrs de forcer le déballage ici?
Declan McKenna le

@Deco Comment l'ajout de minutes à une date reviendrait-il à zéro? Si le monde ne se termine pas à la date qui en résulte, vous êtes en sécurité :)
Leo Dabus

2
La documentation n'est pas claire sur la façon dont cela peut retourner nil. Cette question l'explique, vous avez raison, c'est complètement sûr ici. stackoverflow.com/questions/39358131/…
Declan McKenna

21

Swift 4 :

// ajouter 5 minutes à ce jour

let date = startDate.addingTimeInterval(TimeInterval(5.0 * 60.0))

// soustraire 5 minutes de la date

let date = startDate.addingTimeInterval(TimeInterval(-5.0 * 60.0))

Swift 5.1:

// subtract 5 minutes from date
transportationFromDate.addTimeInterval(TimeInterval(-5.0 * 60.0))

4

Vous pouvez faire de l'arithmétique des dates en utilisant NSDateComponents. Par exemple:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

let r = cal.dateByAddingComponents(comps, toDate: NSDate(), options: nil)

C'est ce que vous voyez lorsque vous l'essayez dans la cour de récréation

entrez la description de l'image ici


4

NSDate.initavec timeIntervalSinceNow:
Ex:

 let dateAfterMin = NSDate.init(timeIntervalSinceNow: (minutes * 60.0))

4

Enregistrez cette petite extension:

extension Int {

 var seconds: Int {
    return self
 }

 var minutes: Int {
    return self.seconds * 60
 }

 var hours: Int {
    return self.minutes * 60
 }

 var days: Int {
    return self.hours * 24
 }

 var weeks: Int {
    return self.days * 7
 }

 var months: Int {
    return self.weeks * 4
 }

 var years: Int {
    return self.months * 12
 }
}

Ensuite, utilisez-le intuitivement comme:

let threeDaysLater = TimeInterval(3.days)
date.addingTimeInterval(threeDaysLater)

2
Malheureusement, les mois et les années sont incorrects. 7 * 4 * 12 = 336, c'est bien moins que 365.
KlimczakM

1
Il peut être amélioré en calculant mois comme celui - ci: self.days * 30et années: self.days * 365. Ce n'est pas parfait car l'année peut avoir 366 jours et le mois peut être différent de 30 jours, mais c'est toujours mieux que 28/336.
KlimczakM

2
Vous ne devriez certainement pas l'utiliser pour toutes les raisons énumérées ci-dessus, c'est inexact dans un tas de cas différents. Utilisez les fonctions arithmétiques de données intégrées
Steven Stefanik

1
Les mois ne sont pas toujours égaux à 4 semaines, qu'en est-il des années bissextiles avec cela?
Mehdi Chennoufi le

3

Vous pouvez utiliser dans swift 4 ou 5

    let date = Date()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd H:mm:ss"
    let current_date_time = dateFormatter.string(from: date)
    print("before add time-->",current_date_time)

    //adding 5 miniuts
    let addminutes = date.addingTimeInterval(5*60)
    dateFormatter.dateFormat = "yyyy-MM-dd H:mm:ss"
    let after_add_time = dateFormatter.string(from: addminutes)
    print("after add time-->",after_add_time)

production:

before add time--> 2020-02-18 10:38:15
after add time--> 2020-02-18 10:43:15

2

Swift 3:

let minutes: TimeInterval = 1 * 60
let nowPlusOne = Date() + minutes

0

Au cas où vous voudriez un horodatage unix

        let now : Date = Date()
        let currentCalendar : NSCalendar = Calendar.current as NSCalendar

        let nowPlusAddTime : Date = currentCalendar.date(byAdding: .second, value: accessTime, to: now, options: .matchNextTime)!

        let unixTime = nowPlusAddTime.timeIntervalSince1970

0

Je pense que le plus simple sera

let minutes = Date(timeIntervalSinceNow:(minutes * 60.0))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.