Como adicionar minutos à hora atual rapidamente


109

Eu sou novo no Swift e estou tentando um programador. Eu tenho a hora de início selecionada e preciso adicionar 5 minutos (ou múltiplos) à hora de início e exibi-la em um 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*

Respostas:


271

Duas abordagens:

  1. Use Calendare date(byAdding:to:wrappingComponents:). Por exemplo, no Swift 3 e posterior:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. Basta usar o +operador (consulte +(_:_:)) para adicionar um TimeInterval(ou seja, um certo número de segundos). Por exemplo, para adicionar cinco minutos, você pode:

    let date = startDate + 5 * 60

    (Observe que a ordem é específica aqui: a data no lado esquerdo do +e os segundos no lado direito.)

    Você também pode usar addingTimeInterval, se preferir:

    let date = startDate.addingTimeInterval(5 * 60)

Resumindo, +/ addingTimeIntervalé mais fácil para cenários simples, mas se você quiser adicionar unidades maiores (por exemplo, dias, meses, etc.), você provavelmente vai querer usar os cálculos do calendário porque eles se ajustam ao horário de verão, addingTimeIntervalmas não .


Para versões do Swift 2, consulte a revisão anterior desta resposta .


Qual dessas 2 abordagens tem melhor desempenho? addTimeInterval or calendar.date (byAdding ...
Nishant

3
Sem addingTimeIntervaldúvida, ele tem mais desempenho (embora provavelmente não seja material, a menos que você esteja fazendo isso milhões de vezes). O que é mais crítico, porém, é se você está falando sobre unidades de medida em dias (ou mais), então a renderização do calendário é preferível porque ela fará todos os ajustes de horário de verão para você.
Rob

40

Você pode usar o método do Agenda

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

para adicionar qualquer Calendar.Componenta qualquer Date. Você pode criar uma extensão de data para adicionar x minutos à UIDatePickerdata de:

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

Então, você pode apenas usar o método de extensão para adicionar minutos ao remetente (UIDatePicker):

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

Teste de parque infantil:

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

Em que circunstâncias .date(byAdding:value:to)retorna nil? Estamos seguros para forçar o desembrulhamento aqui?
Declan McKenna

@Deco Como adicionar minutos a uma data retornaria nulo? Se o mundo não acabar na data resultante, você está seguro :)
Leo Dabus

2
A documentação não está clara sobre como isso pode retornar nulo. Esta pergunta explica isso, você está certo, é totalmente seguro aqui. stackoverflow.com/questions/39358131/…
Declan McKenna

21

Swift 4 :

// adicione 5 minutos até a data

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

// subtraia 5 minutos da 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

Você pode fazer aritmética de data usando NSDateComponents. Por exemplo:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

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

É o que você vê quando experimenta no playground

insira a descrição da imagem aqui


4

NSDate.initcom timeIntervalSinceNow:
Ex:

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

4

Salve esta pequena extensão:

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

Em seguida, use-o intuitivamente como:

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

2
Infelizmente, meses e anos estão incorretos. 7 * 4 * 12 = 336, isso é muito menos do que 365.
KlimczakM

1
Ela pode ser melhorada através do cálculo meses como este: self.days * 30e anos: self.days * 365. Isso não é perfeito porque o ano pode ter 366 dias e o mês pode ser diferente de 30 dias, mas ainda é melhor que 28/336.
KlimczakM de

2
Definitivamente, você não deve usar isso por todos os motivos listados acima; é impreciso em vários casos diferentes. Use as funções aritméticas de dados integradas
Steven Stefanik

1
Meses nem sempre são iguais a 4 semanas, também que tal anos bissextos com isso?
Mehdi Chennoufi

3

Você pode usar no 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)

resultado:

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

Caso você queira um 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

Acho que o mais simples será

let minutes = Date(timeIntervalSinceNow:(minutes * 60.0))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.