我是 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*
两种方法:
Calendar
和date(byAdding:to:wrappingComponents:)
。例如,在 Swift 3 及更高版本中:
let calendar = Calendar.current
let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
只需使用
+
运算符(参见 +(_:_:)
)即可添加 TimeInterval
(即一定秒数)。例如。要增加五分钟,您可以:
let date = startDate + 5 * 60
(注意,这里的顺序是具体的:日期在
+
左侧,秒数在右侧。)
addingTimeInterval
:
let date = startDate.addingTimeInterval(5 * 60)
底线,
+
/addingTimeInterval
对于简单场景来说是最简单的,但如果您想添加更大的单位(例如天、月等),您可能需要使用日历计算,因为这些计算会根据夏令时,而 addingTimeInterval
没有。
对于 Swift 2 的演绎,请参阅 此答案的先前修订版。
您可以使用日历的方法
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"
斯威夫特4:
// 向日期添加 5 分钟
let date = startDate.addingTimeInterval(TimeInterval(5.0 * 60.0))
// 从日期中减去 5 分钟
let date = startDate.addingTimeInterval(TimeInterval(-5.0 * 60.0))
斯威夫特 5.1:
// subtract 5 minutes from date
transportationFromDate.addTimeInterval(TimeInterval(-5.0 * 60.0))
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)
您可以在 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
保存这个小扩展:
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)
您可以使用
NSDateComponents
进行日期算术。例如:
import Foundation
let comps = NSDateComponents()
comps.minute = 5
let cal = NSCalendar.currentCalendar()
let r = cal.dateByAddingComponents(comps, toDate: NSDate(), options: nil)
这就是你在游乐场尝试时所看到的
NSDate.init
与 timeIntervalSinceNow
: let dateAfterMin = NSDate.init(timeIntervalSinceNow: (minutes * 60.0))
斯威夫特 3:
let minutes: TimeInterval = 1 * 60
let nowPlusOne = Date() + minutes
我认为最简单的是
let minutes = Date(timeIntervalSinceNow:(minutes * 60.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
在大多数情况下,我们可以使用以下简单的扩展来代替使用日历:
public extension TimeInterval {
init(days: Int = 0, hrs: Int = 0, mins: Int = 0, sec: Int) {
let timeInSec = (sec) + (mins * 60) + (hrs * 60 * 60) + (days * 24 * 60 * 60)
self.init(timeInSec)
}
}
我们可以这样做:
Date.now.addingTimeInterval( -TimeInterval(mins: 5, sec: 0) ) //Now - 5 mins
Date.now.addingTimeInterval( TimeInterval(mins: 5, sec: 0) ) //Now + 5 mins
Date.now.addingTimeInterval( -.init(days: 5, sec: 0) ) //Now - 5 days