Swift'de şimdiki saate dakika nasıl eklenir


109

Swift'de yeniyim ve bir programlayıcı deniyorum. Başlangıç ​​zamanını seçtim ve başlangıç ​​zamanına 5 dakika (veya bunun katlarını) eklemem ve bunu bir UILabel'de görüntülemem gerekiyor mu?

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

Yanıtlar:


271

İki yaklaşım:

  1. Kullanım Calendarve date(byAdding:to:wrappingComponents:). Örneğin, Swift 3 ve sonrasında:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. Bir (yani belirli bir saniye sayısı ) eklemek için +operatörü (bkz. +(_:_:)) TimeIntervalKullanın. Örneğin, beş dakika eklemek için şunları yapabilirsiniz:

    let date = startDate + 5 * 60

    (Not, burada özeldir: sol tarafındaki tarih +ve sağ taraftaki saniye.)

    Dilerseniz şunları da kullanabilirsiniz addingTimeInterval:

    let date = startDate.addingTimeInterval(5 * 60)

Alt satırda, +/ addingTimeIntervalbasit senaryolar için en kolay, ama hiç (örn, günler, aylar,) daha büyük birimler eklemek istiyorsanız oysa, büyük olasılıkla, bu Gün ışığından yararlanma ayarlamak çünkü takvimsel hesaplamaları kullanmak isteyeyim addingTimeIntervaldeğil .


Swift 2 yorumlamaları için, bu cevabın önceki revizyonuna bakın .


Bu 2 yaklaşımdan hangisi daha performanslı? addTimeInterval veya calendar.date (byAdding ...
Nishant,

3
addingTimeInterval(Eğer kez bu milyonlarca yapıyoruz sürece rağmen muhtemelen maddi değil) kuşkusuz daha performanslısı. Yine de daha kritik olan şey, günler (veya daha uzun) cinsinden ölçü birimlerinden bahsediyorsanız, o zaman takvimsel yorumlama tercih edilir çünkü sizin için tüm gün ışığı tasarrufu ayarlamalarını yapacaktır.
Rob

40

Takvim yöntemini kullanabilirsiniz

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

herhangi Calendar.Componentbirine eklemek için Date. Tarihinize x dakika eklemek için bir Tarih uzantısı oluşturabilirsiniz UIDatePicker:

Xcode 8 ve Xcode 9 • Swift 3.0 ve Swift 4.0

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

Ardından, gönderene dakika eklemek için yalnızca uzantı yöntemini kullanabilirsiniz (UIDatePicker):

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

Oyun alanı testi:

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

Hangi koşullar altında .date(byAdding:value:to)geri dönüyor nil? Burada zorla açmak için güvenli miyiz?
Declan McKenna

@Deco Tarihe dakika eklemek nasıl sıfır döndürür? Ortaya çıkan tarihte dünyanın sonu gelmezse güvendesiniz :)
Leo Dabus

2
Dokümantasyon, bunun nasıl sıfıra dönebileceği konusunda net değil. Bu soru bunu açıklıyor, haklısın, burası tamamen güvenli. stackoverflow.com/questions/39358131/…
Declan McKenna

21

Swift 4 :

// bugüne kadar 5 dakika ekle

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

// tarihten 5 dakika çıkar

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

Kullanarak tarih aritmetiği yapabilirsiniz NSDateComponents. Örneğin:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

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

Oyun alanında denediğinizde gördüğünüz şey bu

görüntü açıklamasını buraya girin


4

NSDate.initile timeIntervalSinceNow:
Örn:

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

4

Bu küçük uzantıyı kaydedin:

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

Sonra sezgisel olarak şu şekilde kullanın:

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

2
Maalesef aylar ve yıllar yanlış. 7 * 4 * 12 = 336, bu
365'ten

1
: Bu gibi aylar hesaplayarak geliştirilebilir self.days * 30ve yıllar: self.days * 365. Bu mükemmel değil çünkü yıl 366 gün olabilir ve ay 30 günden farklı olabilir, ancak yine de 28 / 336'dan daha iyidir.
KlimczakM

2
Bunu kesinlikle yukarıda listelenen tüm nedenlerle kullanmamalısınız, birçok farklı durumda yanlıştır.
Yerleşik

1
Aylar her zaman 4 haftaya eşit değildir, bununla artık yıllar nasıl olur?
Mehdi Chennoufi

3

Swift 4 veya 5'de kullanabilirsiniz

    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)

çıktı:

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

Unix zaman damgası istemeniz durumunda

        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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.