So fügen Sie schnell Minuten zur aktuellen Zeit hinzu


109

Ich bin neu bei Swift und versuche einen Scheduler. Ich habe die Startzeit ausgewählt und muss der Startzeit 5 Minuten (oder ein Vielfaches davon) hinzufügen und sie in einem UILabel anzeigen.

    @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*

Antworten:


271

Zwei Ansätze:

  1. Verwenden Sie Calendarund date(byAdding:to:wrappingComponents:). ZB in Swift 3 und höher:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. Verwenden Sie einfach den +Operator (siehe +(_:_:)), um ein TimeInterval(dh eine bestimmte Anzahl von Sekunden) hinzuzufügen . Um beispielsweise fünf Minuten hinzuzufügen, können Sie:

    let date = startDate + 5 * 60

    (Beachten Sie, dass die Reihenfolge hier spezifisch ist: Das Datum auf der linken Seite +und die Sekunden auf der rechten Seite.)

    Sie können auch verwenden addingTimeInterval, wenn Sie möchten:

    let date = startDate.addingTimeInterval(5 * 60)

Unterm Strich ist +/ addingTimeIntervalfür einfache Szenarien am einfachsten, aber wenn Sie jemals größere Einheiten hinzufügen möchten (z. B. Tage, Monate usw.), möchten Sie wahrscheinlich die Kalenderberechnungen verwenden, da diese die Sommerzeit addingTimeIntervalberücksichtigen , während dies nicht der Fall ist .


Informationen zu Swift 2-Wiedergaben finden Sie in der vorherigen Version dieser Antwort .


Welcher dieser beiden Ansätze ist performanter? Hinzufügen von TimeInterval oder Kalender.Datum (von Hinzufügen ...
Nishant

3
Das addingTimeIntervalist zweifellos performanter (obwohl es wahrscheinlich nicht wesentlich ist, wenn Sie dies nicht millionenfach tun). Was jedoch kritischer ist, ist, wenn Sie über Maßeinheiten in Tagen (oder länger) sprechen, dann ist die kalendarische Wiedergabe vorzuziehen, da sie alle Anpassungen der Sommerzeit für Sie übernimmt.
Rob

40

Sie können die Kalendermethode verwenden

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

jeder hinzufügen Calendar.Componentzu einem Date. Sie können eine Datumserweiterung erstellen, um Ihrem Datum x Minuten hinzuzufügen UIDatePicker:

Xcode 8 und Xcode 9 • Swift 3.0 und Swift 4.0

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

Dann können Sie einfach die Erweiterungsmethode verwenden, um dem Absender Minuten hinzuzufügen (UIDatePicker):

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

Spielplatztests:

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

Unter welchen Umständen kehrt .date(byAdding:value:to)zurück nil? Können wir hier sicher das Auspacken erzwingen?
Declan McKenna

@Deco Wie würde das Hinzufügen von Minuten zu einem Datum Null zurückgeben? Wenn die Welt in dem resultierenden Datum nicht
untergeht,

2
In der Dokumentation ist nicht klar, wie dies null zurückgeben kann. Diese Frage erklärt es, Sie haben Recht, es ist hier völlig sicher. stackoverflow.com/questions/39358131/…
Declan McKenna

21

Swift 4 :

// füge 5 Minuten zum Datum hinzu

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

// 5 Minuten vom Datum abziehen

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

Sie können Datumsarithmetik mit verwenden NSDateComponents. Beispielsweise:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

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

Es ist das, was Sie sehen, wenn Sie es auf dem Spielplatz versuchen

Geben Sie hier die Bildbeschreibung ein


4

NSDate.initmit timeIntervalSinceNow:
Bsp.:

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

4

Speichern Sie diese kleine Erweiterung:

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
 }
}

Verwenden Sie es dann intuitiv wie folgt:

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

2
Leider sind Monate und Jahre falsch. 7 * 4 * 12 = 336, das ist viel weniger als 365.
KlimczakM

1
Es kann verbessert werden, indem Monate wie folgt berechnet werden: self.days * 30und Jahre : self.days * 365. Dies ist nicht perfekt, da das Jahr 366 Tage haben kann und der Monat sich von 30 Tagen unterscheiden kann, aber es ist immer noch besser als 28/336.
KlimczakM

2
Sie sollten dies definitiv nicht aus allen oben genannten Gründen verwenden, da es in vielen verschiedenen Fällen ungenau ist. Verwenden Sie die integrierten Datenarithmetikfunktionen
Steven Stefanik

1
Monate sind nicht immer gleich 4 Wochen, und wie wäre es damit mit Schaltjahren?
Mehdi Chennoufi

3

Sie können in Swift 4 oder 5 verwenden

    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)

Ausgabe:

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

Falls Sie einen Unix-Zeitstempel möchten

        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

Ich denke das einfachste wird sein

let minutes = Date(timeIntervalSinceNow:(minutes * 60.0))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.