【问题标题】:Finding time between dates in Swift [duplicate]在 Swift 中查找日期之间的时间 [重复]
【发布时间】:2015-03-26 02:22:51
【问题描述】:

您好,我正在尝试使用 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.
}


}

【问题讨论】:

    标签: swift nsdate uipickerview nsdateformatter nsdatecomponents


    【解决方案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)!
        }
    }
    

    【讨论】:

    • 谢谢,我知道我认为格式化日期仅用于字符串表示,但要对其进行计算,您必须使用组件,以便您可以对其执行各种方法。我会试试这些。
    • 太棒了,今晚我将尝试将打印出的标签格式设置为天、小时、米、秒。你帮了大忙!
    • 只是一个简单的问题,您为什么使用扩展而不是函数?
    • 一个函数也可以。我只是认为扩展使代码更容易编码和可视化。它还允许您执行称为遍历和柯里化的操作。
    【解决方案2】:

    这可以通过更简单的方式完成:

    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 对象。除非您想以某种格式打印/使用日期,否则无需使用日期格式化程序。

    【讨论】:

    • 今晚我也会试试这个作为替代方案。感谢您的帮助。
    • 投反对票是怎么回事?
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 2016-06-28
    • 2016-07-11
    • 2021-01-07
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多