Cómo agregar minutos a la hora actual en Swift


109

Soy nuevo en Swift y estoy probando un programador. He seleccionado la hora de inicio y necesito agregar 5 minutos (o múltiplos de ella) a la hora de inicio y mostrarla en 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*

Respuestas:


271

Dos enfoques:

  1. Utilice Calendary date(byAdding:to:wrappingComponents:). Por ejemplo, en Swift 3 y posteriores:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. Simplemente use el +operador (ver +(_:_:)) para agregar un TimeInterval(es decir, una cierta cantidad de segundos). Por ejemplo, para agregar cinco minutos, puede:

    let date = startDate + 5 * 60

    (Tenga en cuenta que el orden es específico aquí: la fecha en el lado izquierdo +y los segundos en el lado derecho).

    También puede utilizar addingTimeInterval, si lo prefiere:

    let date = startDate.addingTimeInterval(5 * 60)

En pocas palabras, +/ addingTimeIntervales más fácil para escenarios simples, pero si alguna vez desea agregar unidades más grandes (por ejemplo, días, meses, etc.), es probable que desee utilizar los cálculos calendáricos porque se ajustan al horario de verano, mientras addingTimeIntervalque no .


Para las representaciones de Swift 2, consulte la revisión anterior de esta respuesta .


¿Cuál de estos 2 enfoques es más eficaz? addedTimeInterval o calendar.date (porAdding ...
Nishant

3
Sin addingTimeIntervalduda, es más eficaz (aunque probablemente no sea material a menos que lo esté haciendo millones de veces). Sin embargo, lo que es más crítico es que si está hablando de unidades de medida en días (o más), entonces la versión calendárica es preferible porque hará todos los ajustes de horario de verano por usted.
Rob

40

Puedes usar el método de Calendar

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

para agregar cualquiera Calendar.Componenta cualquiera Date. Puede crear una extensión de fecha para agregar x minutos a su UIDatePickerfecha:

Xcode 8 y Xcode 9 • Swift 3.0 y Swift 4.0

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

Luego, puede usar el método de extensión para agregar minutos al remitente (UIDatePicker):

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

Prueba de patio de recreo:

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

¿En qué circunstancias .date(byAdding:value:to)vuelve nil? ¿Estamos seguros de forzar a desenvolver aquí?
Declan McKenna

@Deco ¿Cómo volvería cero agregar minutos a una fecha? Si el mundo no llega a su fin en la fecha resultante, estás a salvo :)
Leo Dabus

2
La documentación no está clara sobre cómo esto puede devolver nil. Esta pregunta lo explica, tienes razón, aquí es completamente seguro. stackoverflow.com/questions/39358131/…
Declan McKenna

21

Rápido 4 :

// agrega 5 minutos hasta la fecha

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

// restar 5 minutos de la fecha

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

Rápido 5.1:

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

4

Puede hacer aritmética de fechas usando NSDateComponents. Por ejemplo:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

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

Es lo que ves cuando lo pruebas en el patio de recreo.

ingrese la descripción de la imagen aquí


4

NSDate.initcon timeIntervalSinceNow:
Ej:

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

4

Guarde esta pequeña extensión:

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

Luego utilícelo intuitivamente como:

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

2
Desafortunadamente, los meses y los años son incorrectos. 7 * 4 * 12 = 336, esto es mucho menos que 365.
KlimczakM

1
Se puede mejorar mediante el cálculo de meses como esta: self.days * 30y años: self.days * 365. Esto no es perfecto porque el año puede tener 366 días y el mes puede ser diferente a 30 días, pero aún así es mejor que 28/336.
KlimczakM

2
Definitivamente no debe usar esto por todas las razones enumeradas anteriormente, es inexacto en muchos casos diferentes. Utilice las funciones aritméticas de datos integradas
Steven Stefanik

1
Los meses no siempre son iguales a 4 semanas, también ¿qué tal los años bisiestos con esto?
Mehdi Chennoufi

3

Puede usar en 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)

salida:

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

En caso de que desee una marca de tiempo 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

Creo que lo mas simple sera

let minutes = Date(timeIntervalSinceNow:(minutes * 60.0))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.