Как быстро добавить минуты к текущему времени


109

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

Ответы:


271

Два подхода:

  1. Используйте Calendarи date(byAdding:to:wrappingComponents:). Например, в Swift 3 и новее:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. Просто используйте +оператор (см. +(_:_:)), Чтобы добавить TimeInterval(т.е. определенное количество секунд). Например, чтобы добавить пять минут, вы можете:

    let date = startDate + 5 * 60

    (Обратите внимание, порядок здесь конкретный: дата слева от значка +и секунды справа.)

    Вы также можете использовать addingTimeInterval, если хотите:

    let date = startDate.addingTimeInterval(5 * 60)

Итог: +/ addingTimeIntervalявляется самым простым для простых сценариев, но если вы когда-нибудь захотите добавить большие единицы (например, дни, месяцы и т. Д.), Вы, вероятно, захотите использовать календарные вычисления, потому что они корректируются для летнего времени, а addingTimeIntervalне .


Для представлений Swift 2 см. Предыдущую версию этого ответа .


Какой из этих двух подходов более эффективен? addTimeInterval или calendar.date (byAdding ...
Nishant

3
addingTimeInterval, Несомненно , более производительный (хотя , вероятно , не материал , если вы делаете это миллионы раз). Что еще более важно, если вы говорите об единицах измерения в днях (или дольше), тогда предпочтительнее календарное представление, потому что оно будет выполнять все корректировки перехода на летнее время за вас.
Роб

40

Вы можете использовать метод календаря

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

добавить любой Calendar.Componentк любому Date. Вы можете создать расширение даты, чтобы добавить x минут к вашей 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)!
    }
}

Затем вы можете просто использовать метод расширения, чтобы добавить минуты отправителю (UIDatePicker):

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

Тестирование детской площадки:

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

При каких обстоятельствах .date(byAdding:value:to)возвращается nil? Можно ли здесь принудительно развернуть упаковку?
Деклан МакКенна

@Deco Как добавление минут к дате вернет ноль? Если в назначенное время не наступит конец света, вы в безопасности :)
Лео Дабус

2
В документации не ясно, как это может вернуть nil. Этот вопрос все объясняет, вы правы, здесь совершенно безопасно. stackoverflow.com/questions/39358131/…
Деклан МакКенна

21

Swift 4 :

// добавляем 5 минут к дате

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

// вычитаем 5 минут из даты

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

Вы можете выполнять арифметические операции с датами, используя NSDateComponents. Например:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

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

Это то, что вы видите, когда пробуете его на детской площадке

введите описание изображения здесь



4

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

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)

2
К сожалению, месяцы и годы неверны. 7 * 4 * 12 = 336, это намного меньше, чем 365.
KlimczakM

1
Это может быть улучшено путем расчета месяцев , как это: self.days * 30и годы: self.days * 365. Это не идеально, потому что в году может быть 366 дней, а месяц может отличаться от 30 дней, но все же лучше, чем 28/336.
KlimczakM

2
Вы определенно не должны использовать это по всем причинам, перечисленным выше, это неточно во множестве разных случаев. Используйте встроенные арифметические функции данных
Стивен Стефаник

1
Месяцы не всегда равны 4 неделям. А как насчет високосных лет?
Мехди Ченнуфи,

3

Вы можете использовать в быстрых 4 или 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)

вывод:

before add time--> 2020-02-18 10:38:15
after add time--> 2020-02-18 10:43:15


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.