วิธีเพิ่มนาทีในเวลาปัจจุบันอย่างรวดเร็ว


112

ฉันเพิ่งเริ่มใช้ 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*

คำตอบ:


274

สองแนวทาง:

  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ไม่ได้ .


สำหรับสวิฟท์ 2 ซ้ำให้ดูที่การแก้ไขก่อนหน้าของคำตอบนี้


2 แนวทางใดมีประสิทธิภาพมากกว่ากัน addedTimeInterval หรือ calendar.date (byAdding ...
Nishant

4
สิ่งaddingTimeIntervalนี้มีประสิทธิภาพมากขึ้นอย่างไม่ต้องสงสัย (แม้ว่าจะไม่เป็นสาระสำคัญเว้นแต่คุณจะทำสิ่งนี้หลายล้านครั้ง) สิ่งที่สำคัญกว่าคือถ้าคุณกำลังพูดถึงหน่วยวัดเป็นวัน (หรือนานกว่านั้น) การแสดงผลตามปฏิทินจะดีกว่าเพราะจะทำการปรับการออมแสงทั้งหมดให้คุณ
Rob

42

คุณสามารถใช้วิธีการของปฏิทิน

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? เราปลอดภัยที่จะบังคับแกะที่นี่หรือไม่?
Declan McKenna

@Deco จะเพิ่มนาทีลงใน Date return nil ได้อย่างไร? หากโลกไม่ถึงจุดจบในวันที่เกิดคุณก็ปลอดภัย :)
Leo Dabus

3
เอกสารประกอบไม่ชัดเจนว่าจะคืนค่าศูนย์ได้อย่างไร คำถามนี้อธิบายว่าคุณคิดถูกแล้วที่นี่ปลอดภัยอย่างสมบูรณ์ stackoverflow.com/questions/39358131/…
Declan McKenna

22

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)

3
ขออภัยเดือนและปีไม่ถูกต้อง 7 * 4 * 12 = 336 ซึ่งน้อยกว่า 365 มาก
KlimczakM

1
สามารถปรับปรุงได้โดยการคำนวณเดือนเช่นนี้: self.days * 30และปี: self.days * 365. สิ่งนี้ไม่สมบูรณ์แบบเพราะปีสามารถมี 366 วันและเดือนอาจแตกต่างกันได้มากกว่า 30 วัน แต่ก็ยังดีกว่า 28/336
KlimczakM

2
คุณไม่ควรใช้สิ่งนี้ด้วยเหตุผลทั้งหมดที่ระบุไว้ข้างต้นซึ่งไม่ถูกต้องในหลายกรณี ใช้ฟังก์ชันเลขคณิตข้อมูลในตัว
Steven Stefanik

1
เดือนจะไม่เท่ากับ 4 สัปดาห์เสมอไปแล้วปีอธิกสุรทินกับสิ่งนี้ล่ะ?
Mehdi Chennoufi

4

คุณสามารถใช้ใน 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

ในกรณีที่คุณต้องการประทับเวลายูนิกซ์

        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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.