2015-04-06 3 views
47

Я новичок в Swift и пытаюсь планировщик. У меня есть время начала, и мне нужно добавить 5 минут (или кратность) к началу и отобразить его в UILabel?Как добавить минуты к текущему времени в 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* 

ответ

141

два подхода:

  1. Используйте календарь:

    В Swift 3:

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

    Или, в Swift 2:

    let calendar = NSCalendar.currentCalendar() 
    let date = calendar.dateByAddingUnit(.Minute, value: 5, toDate: startDate, options: []) 
    
  2. Просто используйте dateByAddingTimeInterval, чтобы добавить определенное количество секунд.

    Например, в Swift 3:

    let date = startDate.addingTimeInterval(5.0 * 60.0) 
    

    Или в Swift 2:

    let date = startDate.dateByAddingTimeInterval(5.0 * 60.0) 
    

Bottom линии, dateByAddingTimeInterval проще, но если вы когда-нибудь добавляющих дней, месяцев и т. д., вы хотите использовать календарные вычисления, потому что они корректируют переход на летнее время, тогда как dateByAddingTimeInterval - нет.

16

Вы можете использовать метод Календаря func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date? добавить любой Calendar.Component к любому Date. Вы можете создать расширение даты, чтобы добавить х минут, чтобы ваши UIDatePicker «ы Дата:

Xcode 8 и Xcode 9 • Swift 3,0 и Swift 4,0

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

Тогда вы можете просто использовать свой расширение следующим образом:

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

тест Playground ING:

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

Конечно я скоро, только что закончил перенос мое приложение Swift3 но нету завершения тестирования его –

+0

@DanBeaulieu сделано –

+0

Под какие обстоятельства '.date (byAdding: value: to)' return 'nil'? Можем ли мы безопасно форсировать здесь разворот? – Deco

2

Вы можете сделать арифметику даты с помощью NSDateComponents.Например:

import Foundation 

let comps = NSDateComponents() 

comps.minute = 5 

let cal = NSCalendar.currentCalendar() 

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

Это то, что вы видите, когда вы пытаетесь его в детской площадке

enter image description here

1

NSDate.init с timeIntervalSinceNow:
Ex:

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

Сохранить небольшое расширение:

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

Затем использовать его интуитивно, как:

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

Swift 3:

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

Swift 4:

// добавить 5 минут до даты

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

// вычесть 5 минут с момента

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

В случае, если вы хотите Отметка времени 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 
Смежные вопросы