Jak szybko dodać minuty do aktualnego czasu


109

Jestem nowy w Swift i próbuję skorzystać z harmonogramu. Mam wybrany czas rozpoczęcia i muszę dodać 5 minut (lub jego wielokrotność) do czasu rozpoczęcia i wyświetlić go w 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*

Odpowiedzi:


271

Dwa podejścia:

  1. Użyj Calendari date(byAdding:to:wrappingComponents:). Np. W Swift 3 i nowszych:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. Po prostu użyj +operatora (zobacz +(_:_:)), aby dodać TimeInterval(tj. Określoną liczbę sekund). Np. Aby dodać pięć minut, możesz:

    let date = startDate + 5 * 60

    (Uwaga: kolejność jest tutaj specyficzna: data po lewej stronie +i sekundy po prawej stronie.)

    Możesz także użyć addingTimeInterval, jeśli wolisz:

    let date = startDate.addingTimeInterval(5 * 60)

Podsumowując, +/ addingTimeIntervaljest najłatwiejsze w przypadku prostych scenariuszy, ale jeśli kiedykolwiek zechcesz dodać większe jednostki (np. Dni, miesiące itp.), Prawdopodobnie będziesz chciał skorzystać z obliczeń kalendarzowych, ponieważ dostosowują się one do czasu letniego, a addingTimeIntervalnie .


W przypadku wersji Swift 2 zobacz poprzednią wersję tej odpowiedzi .


Które z tych dwóch podejść jest bardziej wydajne? addedTimeInterval lub calendar.date (byAdding ...
Nishant

3
addingTimeIntervalJest niewątpliwie bardziej wydajnych (choć prawdopodobnie nie materiał, chyba że robisz to miliony razy). Bardziej krytyczne jest jednak to, że jeśli mówisz o jednostkach miary w dniach (lub dłużej), preferowane jest odwzorowanie kalendarza, ponieważ wykona za Ciebie wszystkie korekty czasu letniego.
Rob

40

Możesz użyć metody Kalendarza

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

aby dodać Calendar.Componentdo dowolnego Date. Możesz utworzyć rozszerzenie daty, aby dodać x minut do swojej UIDatePickerdaty:

Xcode 8 i Xcode 9 • Swift 3.0 i Swift 4.0

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

Następnie możesz po prostu użyć metody rozszerzenia, aby dodać minuty do nadawcy (UIDatePicker):

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

Testowanie placu zabaw:

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

W jakich okolicznościach .date(byAdding:value:to)powraca nil? Czy możemy tu bezpiecznie wymusić rozpakowanie?
Declan McKenna

@Deco Jak dodanie minut do daty zwróciło zero? Jeśli świat nie dobiegnie końca w wyznaczonym terminie, jesteś bezpieczny :)
Leo Dabus

2
Dokumentacja nie jest jasna, jak to może zwrócić zero. To pytanie wyjaśnia to, masz rację, jest tu całkowicie bezpiecznie. stackoverflow.com/questions/39358131/…
Declan McKenna

21

Swift 4 :

// dodaj 5 minut do daty

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

// odejmij 5 minut od daty

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

Możesz wykonywać arytmetykę dat przy użyciu NSDateComponents. Na przykład:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

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

To jest to, co widzisz, kiedy próbujesz tego na placu zabaw

wprowadź opis obrazu tutaj


4

NSDate.initz timeIntervalSinceNow:
Ex:

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

4

Zapisz to małe rozszerzenie:

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

Następnie użyj go intuicyjnie, jak:

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

2
Niestety miesiące i lata są nieprawidłowe. 7 * 4 * 12 = 336, to znacznie mniej niż 365.
KlimczakM,

1
To może być ulepszona poprzez obliczenie miesięcy tak: self.days * 30i lata self.days * 365. To nie jest idealne, ponieważ rok może mieć 366 dni, a miesiąc może być inny niż 30 dni, ale nadal jest lepszy niż 28/336.
KlimczakM

2
Zdecydowanie nie powinieneś tego używać ze wszystkich powodów wymienionych powyżej, jest to niedokładne w wielu różnych przypadkach. Użyj wbudowanych funkcji arytmetycznych danych
Steven Stefanik

1
Miesiące nie zawsze są równe 4 tygodniom, a co z latami przestępnymi?
Mehdi Chennoufi

3

Możesz użyć w Swift 4 lub 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)

wynik:

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

Jeśli chcesz unix timestamp

        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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.