Come aggiungere minuti all'ora corrente in modo rapido


109

Sono nuovo su Swift e sto provando uno scheduler. Ho selezionato l'ora di inizio e devo aggiungere 5 minuti (o multipli di essa) all'ora di inizio e visualizzarla in una 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*

Risposte:


271

Due approcci:

  1. Usa Calendare date(byAdding:to:wrappingComponents:). Ad esempio, in Swift 3 e versioni successive:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. Basta usare l' +operatore (vedi +(_:_:)) per aggiungere un TimeInterval(cioè un certo numero di secondi). Ad esempio, per aggiungere cinque minuti, puoi:

    let date = startDate + 5 * 60

    (Nota, l'ordine è specifico qui: la data sul lato sinistro del +e i secondi sul lato destro.)

    Puoi anche usare addingTimeInterval, se preferisci:

    let date = startDate.addingTimeInterval(5 * 60)

In conclusione, +/ addingTimeIntervalè più facile per scenari semplici, ma se vuoi aggiungere unità più grandi (ad esempio giorni, mesi, ecc.), Probabilmente vorrai usare i calcoli del calendario perché quelli regolano per l'ora legale, mentre addingTimeIntervalnon lo fa .


Per le interpretazioni di Swift 2, vedere la revisione precedente di questa risposta .


Quale di questi 2 approcci è più performante? aggiungendoTimeInterval o calendar.date (byAdding ...
Nishant

3
La addingTimeInterval(non però probabile che il materiale a meno che non si sta facendo questo milioni di volte) è senza dubbio più performante. Ciò che è più critico, tuttavia, è che se stai parlando di unità di misura in giorni (o più), la resa del calendario è preferibile perché farà tutte le regolazioni dell'ora legale per te.
Rob il

40

Puoi utilizzare il metodo di Calendar

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

per aggiungere qualsiasi Calendar.Componenta qualsiasi Date. Puoi creare un'estensione data per aggiungere x minuti alla tua UIDatePickerdata:

Xcode 8 e Xcode 9 • Swift 3.0 e Swift 4.0

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

Quindi puoi semplicemente usare il metodo di estensione per aggiungere minuti al mittente (UIDatePicker):

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

Test del parco giochi:

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

In quali circostanze .date(byAdding:value:to)ritorna nil? Possiamo forzare lo scartamento qui?
Declan McKenna

@Deco Come sarebbe nullo l'aggiunta di minuti a una data? Se il mondo non finisce nella data risultante, sei al sicuro :)
Leo Dabus

2
La documentazione non è chiara su come questo possa restituire zero. Questa domanda lo spiega, hai ragione qui è completamente al sicuro. stackoverflow.com/questions/39358131/…
Declan McKenna

21

Swift 4 :

// aggiungi 5 minuti fino ad oggi

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

// sottrai 5 minuti dalla data

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

Puoi eseguire l'aritmetica della data usando NSDateComponents. Per esempio:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

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

È quello che vedi quando lo provi nel parco giochi

inserisci qui la descrizione dell'immagine


4

NSDate.initcon timeIntervalSinceNow:
Es:

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

4

Salva questa piccola estensione:

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

Quindi usalo in modo intuitivo come:

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

2
Purtroppo i mesi e gli anni non sono corretti. 7 * 4 * 12 = 336, questo è molto meno di 365.
KlimczakM

1
Può essere migliorata calcolando mesi come questo: self.days * 30e anni: self.days * 365. Questo non è perfetto perché l'anno può avere 366 giorni e il mese può essere diverso da 30 giorni, ma è comunque migliore di 28/336.
KlimczakM

2
Non dovresti assolutamente usarlo per tutti i motivi sopra elencati, è impreciso in molti casi diversi. Utilizza le funzioni aritmetiche dei dati integrate
Steven Stefanik

1
I mesi non sono sempre pari a 4 settimane, anche che ne dici di anni bisestili con questo?
Mehdi Chennoufi,

3

Puoi usare in swift 4 o 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)

produzione:

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

Nel caso in cui desideri un timestamp 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

Penso che il più semplice sarà

let minutes = Date(timeIntervalSinceNow:(minutes * 60.0))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.