Як швидко додати хвилини до поточного часу


109

Я новачок у Свіфт і намагаюся планувати. У мене вибрано час початку, і мені потрібно додати 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. Ви можете створити розширення дати, щоб додати х хвилин до своєї 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
У документації не ясно, як це може повернути нуль. Це питання пояснює це, ви праві, що тут абсолютно безпечно. stackoverflow.com/questions/39358131/…
Деклан МакКенна

21

Швидкий 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.
КлимчакM

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

2

Швидкий 3:

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

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.