【问题标题】:How to add minutes to current time in swift如何快速将分钟添加到当前时间
【发布时间】:2015-06-10 11:49:13
【问题描述】:

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

【问题讨论】:

    标签: ios swift date


    【解决方案1】:
    extension Date {
        func withAddedMinutes(minutes: Double) -> Date {
             addingTimeInterval(minutes * 60)
        }
    
        func withAddedHours(hours: Double) -> Date {
             withAddedMinutes(minutes: hours * 60)
        }
    }
    

    用例

    let anHourFromNow = Date().withAddedHours(hours: 1)
    let aMinuteFromNow = Date().withAddedMinutes(minutes: 1)
    

    【讨论】:

      【解决方案2】:

      两种方法:

      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 的版本,请参阅 previous revision of this answer

      【讨论】:

      • 这两种方法中哪一种性能更高? addTimeInterval 或 calendar.date(byAdding...
      • addingTimeInterval 无疑性能更高(尽管除非您这样做数百万次,否则可能并不重要)。不过,更关键的是,如果您在谈论以天(或更长)为单位的度量单位,那么日历格式更可取,因为它会为您完成所有夏令时调整。
      【解决方案3】:

      你可以在swift 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
      

      【讨论】:

        【解决方案4】:

        我认为最简单的是

        let minutes = Date(timeIntervalSinceNow:(minutes * 60.0))
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            你可以使用日历的方法

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

            将任何Calendar.Component 添加到任何Date。您可以创建一个日期扩展来为您的UIDatePicker 的日期添加 x 分钟:

            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?我们在这里强制解包安全吗?
            • @Deco 如何将分钟添加到日期返回零?如果世界没有在最终的日期结束,你是安全的:)
            • 文档不清楚如何返回 nil。这个问题解释了它,你是对的,这里是完全安全的。 stackoverflow.com/questions/39358131/…
            【解决方案7】:

            如果你想要 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
            

            【讨论】:

              【解决方案8】:

              斯威夫特 3:

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

              【讨论】:

                【解决方案9】:

                保存这个小扩展:

                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)
                

                【讨论】:

                • 很遗憾,月份和年份不正确。 7 * 4 * 12 = 336,这远小于 365。
                • 可以通过计算月份来改进:self.days * 30 和年份:self.days * 365。这并不完美,因为一年可以有 366 天,而月份可以不同于 30 天,但仍然比 28/336 好。
                • 由于上面列出的所有原因,您绝对不应该使用它,它在很多不同的情况下都是不准确的。使用内置的数据算术函数
                • 月份并不总是等于 4 周,那么闰年呢?
                【解决方案10】:

                NSDate.inittimeIntervalSinceNow:
                例如:

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

                【讨论】:

                  【解决方案11】:

                  您可以使用NSDateComponents 进行日期运算。例如:

                  import Foundation
                  
                  let comps = NSDateComponents()
                  
                  comps.minute = 5
                  
                  let cal = NSCalendar.currentCalendar()
                  
                  let r = cal.dateByAddingComponents(comps, toDate: NSDate(), options: nil)
                  

                  这是你在操场上尝试时所看到的

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-03-28
                    • 2019-12-20
                    • 2020-07-02
                    • 2012-08-14
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-07-11
                    相关资源
                    最近更新 更多