2015-04-06 11 views
47

Sono nuovo a Swift e sto provando un programmatore. Ho selezionato l'ora di inizio e devo aggiungere 5 minuti (o multipli di esso) all'ora di inizio e visualizzarla in un UILabel?Come aggiungere minuti all'ora corrente in swift

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

risposta

141

due approcci:

  1. usare il calendario:

    In Swift 3:

    let calendar = Calendar.current 
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate) 
    

    O, in Swift 2:

    let calendar = NSCalendar.currentCalendar() 
    let date = calendar.dateByAddingUnit(.Minute, value: 5, toDate: startDate, options: []) 
    
  2. Basta usare dateByAddingTimeInterval per aggiungere un certo numero di secondi.

    Per esempio, in Swift 3:

    let date = startDate.addingTimeInterval(5.0 * 60.0) 
    

    O a Swift 2:

    let date = startDate.dateByAddingTimeInterval(5.0 * 60.0) 
    

Linea di fondo, dateByAddingTimeInterval è più facile, ma se mai arriva a l'aggiunta di giorni, mesi , ecc., si desidera utilizzare i calcoli del calendario perché questi si adattano all'ora legale, mentre lo dateByAddingTimeInterval no.

16

È possibile utilizzare il metodo di calendario func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date? di aggiungere qualsiasi Calendar.Component a qualsiasi Date. È possibile creare un'estensione Data di aggiungere x minuti alle tue UIDatePicker 's data: 4,0

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

Poi si può solo utilizzare

Xcode 8 e Xcode 9 • Swift 3.0 e Swift tua estensione come segue:

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

prova Playground ing:

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

sicuro che presto, appena finito il porting mia app per Swift3 ma havent finito testarlo –

+0

@DanBeaulieu fatto –

+0

Sotto quali circostanze fa '.date (byAdding: value: to)' return 'nil'? Siamo sicuri di forzare lo scartare qui? – Deco

2

È possibile eseguire la data aritmetica utilizzando NSDateComponents.Per esempio:

import Foundation 

let comps = NSDateComponents() 

comps.minute = 5 

let cal = NSCalendar.currentCalendar() 

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

E 'quello che si vede quando si prova nel parco giochi

enter image description here

1

NSDate.init con timeIntervalSinceNow:
Es:

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

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 utilizzarlo in modo intuitivo come:

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

Swift 3:

let minutes: TimeInterval = 1 * 60 
let nowPlusOne = Date() + minutes 
2

Swift 4:

// aggiungere 5 minuti fino ad oggi

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

// sottrarre 5 minuti dalla data

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

Nel caso in cui si desidera 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 
Problemi correlati