嗨我正在尝试使用UIpickers计算两个日期之间的时间,我迷路了。我无法理解在哪里可以获得插入标签的价值。我不确定是否应该使用组件或在比较之前或之后将其放入标签中。谢谢你的任何指示。
let calendar = NSCalendar.currentCalendar()
let userCalendar = NSCalendar.currentCalendar()
// Set up date object
let DateMakerFormatter = NSDateFormatter()
let date = NSDate()
@IBOutlet weak var toDatePicker: UIDatePicker!
@IBOutlet weak var fromDatePicker: UIDatePicker!
@IBOutlet weak var dayYearLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func toDatePickerAction(sender: UIDatePicker) {
var DateFormatter = NSDateFormatter()
DateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
var endTime = DateFormatter.stringFromDate(toDatePicker.date)
self.dayYearLabel.text = endTime
var targetDate = endTime
println("\(endTime)")
}
@IBAction func fromDatePickerAction(sender: UIDatePicker) {
var fromDateFormatter = NSDateFormatter()
fromDateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
var startTime = fromDateFormatter.stringFromDate(fromDatePicker.date)
self.dayYearLabel.text = startTime
var targetDate2 = startTime
println("\(startTime)")
}
@IBAction func getTheDateButton(sender: AnyObject) {
let calendar = NSCalendar.currentCalendar()
let datecomponents = calendar.components(NSCalendarUnit.CalendarUnitSecond,
fromDate: startTime, toDate: endTime, options: nil)
let second = datecomponents.second
let minute = datecomponents.minute
let hour = datecomponents.hour
let day = datecomponents.day
let year = datecomponents.year
println("Seconds: \(second)")
println("minutes: \(minute)")
println("hours: \(hour)")
println("days: \(day)")
println("years: \(year)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
答案 0 :(得分:1)
您应该尝试使用一些扩展来帮助您整理代码。假设您已从上面的链接复制了这些扩展,您可以执行以下操作:
class ViewController: UIViewController {
@IBOutlet weak var timeLabel: UILabel!
@IBOutlet weak var fromLabel: UILabel!
@IBOutlet weak var toLabel: UILabel!
@IBOutlet weak var fromDatePicker: UIDatePicker!
@IBOutlet weak var toDatePicker: UIDatePicker!
override func viewDidLoad() {
super.viewDidLoad()
fromDatePicker.date = NSDate()
toDatePicker.date = NSDate().xWeeks(1)
dateHasChanged()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func dateHasChanged() {
let fromDate = fromDatePicker.date.earlierDate(toDatePicker.date).zeroSeconds.zeroNanoSeconds
let toDate = toDatePicker.date.laterDate(fromDatePicker.date).zeroSeconds.zeroNanoSeconds
fromLabel.text = fromDate.formatted
toLabel.text = toDate.formatted
timeLabel.text = toDate.offsetFrom(fromDate)
}
}
正如我在这里提到的,是上面链接的扩展名:
extension NSDate {
func yearsFrom(date:NSDate) -> Int{
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.components(NSCalendarUnit.CalendarUnitYear, fromDate: date, toDate: self, options: nil).year
}
func monthsFrom(date:NSDate) -> Int{
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.components(NSCalendarUnit.CalendarUnitMonth, fromDate: date, toDate: self, options: nil).month
}
func weeksFrom(date:NSDate) -> Int{
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.components(NSCalendarUnit.CalendarUnitWeekOfYear, fromDate: date, toDate: self, options: nil).weekOfYear
}
func daysFrom(date:NSDate) -> Int{
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.components(NSCalendarUnit.CalendarUnitDay, fromDate: date, toDate: self, options: nil).day
}
func hoursFrom(date:NSDate) -> Int{
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.components(NSCalendarUnit.CalendarUnitHour, fromDate: date, toDate: self, options: nil).hour
}
func minutesFrom(date:NSDate) -> Int{
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.components(NSCalendarUnit.CalendarUnitMinute, fromDate: date, toDate: self, options: nil).minute
}
func secondsFrom(date:NSDate) -> Int{
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.components(NSCalendarUnit.CalendarUnitSecond, fromDate: date, toDate: self, options: nil).second
}
func offsetFrom(date:NSDate) -> String {
let yearsFromDate = yearsFrom(date)
let monthsFromDate = monthsFrom(date)
let weeksFromDate = weeksFrom(date)
let daysFromDate = daysFrom(date)
let hoursFromDate = hoursFrom(date)
let minutesFromDate = minutesFrom(date)
let secondsFromDate = secondsFrom(date)
if yearsFromDate > 0 { return "\(yearsFromDate) year" + { return yearsFromDate > 1 ? "s" : "" }() }
if monthsFromDate > 0 { return "\(monthsFromDate) month" + { return monthsFromDate > 1 ? "s" : "" }() }
if weeksFromDate > 0 { return "\(weeksFromDate) week" + { return weeksFromDate > 1 ? "s" : "" }() }
if daysFromDate > 0 { return "\(daysFromDate) day" + { return daysFromDate > 1 ? "s" : "" }() }
if hoursFromDate > 0 { return "\(hoursFromDate) hour" + { return hoursFromDate > 1 ? "s" : "" }() }
if minutesFromDate > 0 { return "\(minutesFromDate) minute" + { return minutesFromDate > 1 ? "s" : "" }() }
if secondsFromDate > 0 { return "\(secondsFromDate) second" + { return secondsFromDate > 1 ? "s" : "" }() }
return ""
}
}
你应该创建另外4个扩展,一个用于根据需要格式化日期,另一个用于向NSDate添加日历单元,另外两个用于将日期选择器返回日期的秒和纳秒归零:
extension NSDate {
var formatted: String {
let styler = NSDateFormatter()
styler.dateStyle = .FullStyle
return styler.stringFromDate(self)
}
func xWeeks(weeks:Int) -> NSDate {
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.dateByAddingUnit(.CalendarUnitWeekOfYear, value: weeks, toDate: self, options: nil)!
}
var zeroSeconds: NSDate {
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.dateBySettingUnit(.CalendarUnitSecond, value: 0, ofDate: self, options: nil)!
}
var zeroNanoSeconds: NSDate {
return NSCalendar(calendarIdentifier: NSGregorianCalendar)!.dateBySettingUnit(.CalendarUnitNanosecond, value: 0, ofDate: self, options: nil)!
}
}
答案 1 :(得分:0)
这可以通过更简单的方式完成:
let dateA = NSDate() // Current date & time
let dateB = NSDate(timeIntervalSinceNow: -86400) // 1 day ago
let seconds = dateA.timeIntervalSinceDate(dateB) // 86,399.9766479731
let minutes = seconds / 60 // 1,439.99961079955
let hours = minutes / 60 // 23.9999935133259
let days = hours / 24 // 0.99999972972191
let years = days / 365 // 0.00273972528690934
然后将值向上舍入。您的UIDatePicker已经返回NSDate
个对象。除非您想以特定格式打印/使用日期,否则无需使用日期格式化程序。