如何快速增加分钟到当前时间


109

我是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*

Answers:


271

两种方法:

  1. 使用Calendardate(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演绎版本,请参见此答案先前版本


这两种方法中哪个更有效?addingTimeInterval或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。您可以创建日期扩展名,以将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如何在日期中添加分钟数返回nil?如果世界没有在结果日期终结,那么您会很安全的:)
Leo Dabus

2
关于如何返回nil的文档尚不清楚。这个问题可以解释这一点,您说对了,这里是完全安全的。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

NSDate.inittimeIntervalSinceNow
例如:

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

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。– KlimczakM

1
可以通过计算像这样的月份self.days * 30和年份来改进self.days * 365。这并不完美,因为年份可以有366天,月份可以不同于30天,但仍比28/336好。
KlimczakM

2
绝对不应该出于上述所有原因使用此功能,因为在许多情况下它都不准确。使用内置的数据算术函数
Steven Stefanik,

1
月并不总是等于4周,leap年又如何呢?
Mehdi Chennoufi

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.