Cara menambahkan menit ke waktu saat ini dengan cepat

109

Saya baru mengenal Swift dan sedang mencoba penjadwal. Saya telah memilih waktu mulai dan saya perlu menambahkan 5 menit (atau kelipatannya) ke waktu mulai dan menampilkannya dalam 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*
coba maadee
sumber

Jawaban:

271

Dua pendekatan:

  1. Gunakan Calendardan date(byAdding:to:wrappingComponents:). Misalnya, di Swift 3 dan yang lebih baru:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
    
  2. Cukup gunakan +operator (lihat +(_:_:)) untuk menambahkan TimeInterval(yaitu sejumlah detik). Misal untuk menambahkan lima menit, Anda dapat:

    let date = startDate + 5 * 60

    (Perhatikan, urutannya spesifik di sini: Tanggal di sisi kiri +dan detik di sisi kanan.)

    Anda juga dapat menggunakan addingTimeInterval, jika Anda lebih suka:

    let date = startDate.addingTimeInterval(5 * 60)

Intinya, +/ addingTimeIntervalpaling mudah untuk skenario sederhana, tetapi jika Anda ingin menambahkan unit yang lebih besar (misalnya, hari, bulan, dll.), Anda mungkin ingin menggunakan kalkulasi kalender karena hal itu menyesuaikan dengan penghematan siang hari, sedangkan addingTimeIntervaltidak .


Untuk terjemahan Swift 2, lihat revisi sebelumnya dari jawaban ini .

rampok
sumber
Manakah dari 2 pendekatan berikut yang lebih berkinerja? addTimeInterval atau calendar.date (byAdding ...
Nishant
3
Ini addingTimeIntervaltidak diragukan lagi lebih berkinerja (meskipun kemungkinan tidak material kecuali Anda melakukan ini jutaan kali). Namun, yang lebih penting adalah jika Anda berbicara tentang satuan ukuran dalam beberapa hari (atau lebih lama), maka rendisi kalender lebih disukai karena akan melakukan semua penyesuaian penghematan siang hari untuk Anda.
Rob
40

Anda dapat menggunakan metode Kalender

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

untuk menambahkan apapun Calendar.Componentke apapun Date. Anda dapat membuat ekstensi Tanggal untuk menambahkan x menit ke UIDatePickertanggal Anda:

Xcode 8 dan Xcode 9 • Swift 3.0 dan Swift 4.0

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

Kemudian Anda cukup menggunakan metode ekstensi untuk menambahkan menit ke pengirim (UIDatePicker):

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

Pengujian tempat bermain:

Date().adding(minutes: 10)  //  "Jun 14, 2016, 5:31 PM"
Leo Dabus
sumber
Dalam keadaan apa ia .date(byAdding:value:to)kembali nil? Apakah kita aman untuk membuka paksa di sini?
Declan McKenna
@Deco Bagaimana menambahkan menit ke Tanggal mengembalikan nol? Jika dunia tidak berakhir pada tanggal yang dihasilkan, Anda aman :)
Leo Dabus
2
Dokumentasi tidak jelas tentang bagaimana ini bisa mengembalikan nihil. Pertanyaan ini menjelaskannya, Anda benar, ini sepenuhnya aman di sini. stackoverflow.com/questions/39358131/…
Declan McKenna
21

Cepat 4 :

// tambahkan 5 menit sampai saat ini

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

// kurangi 5 menit dari tanggal

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

Swift 5.1:

// subtract 5 minutes from date
transportationFromDate.addTimeInterval(TimeInterval(-5.0 * 60.0))
Gilad Brunfman
sumber
4

Anda dapat melakukan aritmatika tanggal dengan menggunakan NSDateComponents. Sebagai contoh:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

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

Itulah yang Anda lihat saat mencobanya di taman bermain

masukkan deskripsi gambar di sini

Anthony Kong
sumber
4

NSDate.initdengan timeIntervalSinceNow:
Mis:

 let dateAfterMin = NSDate.init(timeIntervalSinceNow: (minutes * 60.0))
Kumar KL
sumber
4

Simpan ekstensi kecil ini:

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

Kemudian gunakan secara intuitif seperti:

let threeDaysLater = TimeInterval(3.days)
date.addingTimeInterval(threeDaysLater)
Fitsyu
sumber
2
Sayangnya, bulan dan tahun tidak benar. 7 * 4 * 12 = 336, ini jauh lebih kecil dari 365.
KlimczakM
1
Hal ini dapat ditingkatkan dengan menghitung bulan seperti ini: self.days * 30dan tahun: self.days * 365. Ini tidak sempurna karena satu tahun bisa terdiri dari 366 hari, dan bulan bisa berbeda dari 30 hari, tetapi masih lebih baik dari 28/336.
KlimczakM
2
Anda pasti tidak boleh menggunakan ini untuk semua alasan yang tercantum di atas, ini tidak akurat dalam banyak kasus berbeda. Gunakan fungsi aritmatika data bawaan
Steven Stefanik
1
Bulan tidak selalu sama dengan 4 minggu, juga bagaimana dengan tahun kabisat dengan ini?
Mehdi Chennoufi
3

Anda dapat menggunakan dengan cepat 4 atau 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)

keluaran:

before add time--> 2020-02-18 10:38:15
after add time--> 2020-02-18 10:43:15
Enamul Haque
sumber
2

Cepat 3:

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

Jika Anda ingin stempel waktu 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
Pradeep Kumar Kushwaha
sumber
0

Saya pikir yang paling sederhana adalah

let minutes = Date(timeIntervalSinceNow:(minutes * 60.0))
Sachin Nautiyal
sumber