Cách thêm phút vào thời gian hiện tại nhanh chóng


109

Tôi mới sử dụng Swift và đang thử một bộ lập lịch. Tôi đã chọn thời gian bắt đầu và tôi cần thêm 5 phút (hoặc bội số của thời gian đó) vào thời gian bắt đầu và hiển thị nó trong một 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*

Câu trả lời:


271

Hai cách tiếp cận:

  1. Sử dụng Calendardate(byAdding:to:wrappingComponents:). Ví dụ: trong Swift 3 trở lên:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. Chỉ cần sử dụng +toán tử (xem +(_:_:)) để thêm một TimeInterval(tức là một số giây nhất định). Ví dụ: thêm năm phút, bạn có thể:

    let date = startDate + 5 * 60

    (Lưu ý, thứ tự cụ thể ở đây: Ngày ở bên trái +và giây ở bên phải.)

    Bạn cũng có thể sử dụng addingTimeInterval, nếu muốn:

    let date = startDate.addingTimeInterval(5 * 60)

Tóm lại, +/ addingTimeIntervallà dễ dàng nhất cho các tình huống đơn giản, nhưng nếu bạn muốn thêm các đơn vị lớn hơn (ví dụ: ngày, tháng, v.v.), bạn có thể muốn sử dụng các tính toán theo lịch vì những tính toán đó điều chỉnh để tiết kiệm ánh sáng ban ngày, trong khi addingTimeIntervalkhông .


Đối với phiên bản Swift 2, hãy xem phiên bản trước của câu trả lời này .


Cách tiếp cận nào trong 2 cách này hiệu quả hơn? addTimeInterval hoặc calendar.date (byAdding ...
Nishant

3
Các addingTimeIntervalchắc chắn là performant hơn (mặc dù không có khả năng tài liệu, trừ khi bạn đang làm điều này hàng triệu lần). Tuy nhiên, điều quan trọng hơn là nếu bạn đang nói về các đơn vị đo tính theo ngày (hoặc lâu hơn), thì biểu diễn lịch sẽ phù hợp hơn vì nó sẽ thực hiện tất cả các điều chỉnh tiết kiệm ánh sáng ban ngày cho bạn.
Rob

40

Bạn có thể sử dụng phương pháp của Lịch

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

để thêm bất kỳ Calendar.Componentvào bất kỳ Date. Bạn có thể tạo tiện ích mở rộng Ngày để thêm x phút vào UIDatePickerngày của mình:

Xcode 8 và Xcode 9 • Swift 3.0 và Swift 4.0

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

Sau đó, bạn chỉ có thể sử dụng phương thức mở rộng để thêm phút cho người gửi (UIDatePicker):

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

Thử nghiệm sân chơi:

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

Hoàn .date(byAdding:value:to)trả trong trường hợp nào nil? Chúng ta có an toàn khi buộc mở ở đây không?
Declan McKenna

@Deco Làm cách nào để thêm số phút vào Ngày trả về số không? Nếu thế giới không đi đến một kết thúc trong ngày kết quả bạn được an toàn :)
Leo Dabus

2
Tài liệu không rõ ràng về cách điều này có thể trả về con số không. Câu hỏi này giải thích nó, bạn nói đúng, nó hoàn toàn an toàn ở đây. stackoverflow.com/questions/39358131/...
Declan McKenna

21

Swift 4 :

// thêm 5 phút vào ngày

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

// trừ 5 phút từ ngày

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

Bạn có thể làm số học ngày bằng cách sử dụng NSDateComponents. Ví dụ:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

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

Đó là những gì bạn thấy khi chơi thử trong sân chơi

nhập mô tả hình ảnh ở đây


4

NSDate.init với timeIntervalSinceNow :
Ví dụ:

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

4

Lưu phần mở rộng nhỏ này:

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

Sau đó, sử dụng nó một cách trực quan như:

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

2
Thật không may, tháng và năm không chính xác. 7 * 4 * 12 = 336, con số này ít hơn nhiều so với 365.
KlimczakM

1
Nó có thể được cải thiện bằng cách tính toán tháng như thế này: self.days * 30và năm: self.days * 365. Điều này không hoàn hảo vì năm có thể có 366 ngày và tháng có thể khác 30 ngày, nhưng nó vẫn tốt hơn 28/336.
KlimczakM

2
Bạn chắc chắn không nên sử dụng điều này vì tất cả các lý do được liệt kê ở trên, nó không chính xác trong nhiều trường hợp khác nhau. Sử dụng được xây dựng trong chức năng dữ liệu số học
Steven Stefanik

1
Số tháng không phải lúc nào cũng bằng 4 tuần, còn năm nhuận thì sao?
Mehdi Chennoufi

3

Bạn có thể sử dụng trong nhanh 4 hoặc 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)

đầu ra:

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

Trong trường hợp bạn muốn dấu thời gian 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

0

Tôi nghĩ đơn giản nhất sẽ là

let minutes = Date(timeIntervalSinceNow:(minutes * 60.0))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.