ios - 在 Swift 中获取两个日期(月/日/小时/分钟/秒)之间的差异

标签 ios swift macos date nsdate

我正在尝试获取 NSDate() 当前日期与来自 PHP time(); 调用的日期之间的差异,例如:NSDate (timeIntervalSinceReferenceDate: 1417147270)。我如何去获得两个日期之间的时间差。我想要一个比较两个日期的函数,if(seconds > 60) 然后它返回分钟,if(minutes > 60) 返回小时和 if(hours > 24) 返回天数等。

我该怎么办?

编辑:当前接受的答案完全符合我的要求。我建议使用它,以便以 PHP time() 函数使用的形式获取两个日期之间的时间。如果您不是特别熟悉 PHP,那是从 1970 年 1 月 1 日开始的以秒为单位的时间。这对 PHP 后端很有用。如果您可能正在使用像 NodeJS 这样的后端,您可能需要考虑您将在下面找到的其他一些选项。

最佳答案

Xcode 8.3 • Swift 3.1 或更高版本

您可以使用日历来帮助您创建一个扩展来进行日期计算,如下所示:

extension Date {
    /// Returns the amount of years from another date
    func years(from date: Date) -> Int {
        return Calendar.current.dateComponents([.year], from: date, to: self).year ?? 0
    }
    /// Returns the amount of months from another date
    func months(from date: Date) -> Int {
        return Calendar.current.dateComponents([.month], from: date, to: self).month ?? 0
    }
    /// Returns the amount of weeks from another date
    func weeks(from date: Date) -> Int {
        return Calendar.current.dateComponents([.weekOfMonth], from: date, to: self).weekOfMonth ?? 0
    }
    /// Returns the amount of days from another date
    func days(from date: Date) -> Int {
        return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
    }
    /// Returns the amount of hours from another date
    func hours(from date: Date) -> Int {
        return Calendar.current.dateComponents([.hour], from: date, to: self).hour ?? 0
    }
    /// Returns the amount of minutes from another date
    func minutes(from date: Date) -> Int {
        return Calendar.current.dateComponents([.minute], from: date, to: self).minute ?? 0
    }
    /// Returns the amount of seconds from another date
    func seconds(from date: Date) -> Int {
        return Calendar.current.dateComponents([.second], from: date, to: self).second ?? 0
    }
    /// Returns the a custom time interval description from another date
    func offset(from date: Date) -> String {
        if years(from: date)   > 0 { return "\(years(from: date))y"   }
        if months(from: date)  > 0 { return "\(months(from: date))M"  }
        if weeks(from: date)   > 0 { return "\(weeks(from: date))w"   }
        if days(from: date)    > 0 { return "\(days(from: date))d"    }
        if hours(from: date)   > 0 { return "\(hours(from: date))h"   }
        if minutes(from: date) > 0 { return "\(minutes(from: date))m" }
        if seconds(from: date) > 0 { return "\(seconds(from: date))s" }
        return ""
    }
}

使用日期组件格式化程序

let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [.second, .minute, .hour, .day, .weekOfMonth, .month, .year]
dateComponentsFormatter.maximumUnitCount = 1
dateComponentsFormatter.unitsStyle = .full
dateComponentsFormatter.string(from: Date(), to: Date(timeIntervalSinceNow: 4000000))  // "1 month"

let date1 = DateComponents(calendar: .current, year: 2014, month: 11, day: 28, hour: 5, minute: 9).date!
let date2 = DateComponents(calendar: .current, year: 2015, month: 8, day: 28, hour: 5, minute: 9).date!

let years = date2.years(from: date1)     // 0
let months = date2.months(from: date1)   // 9
let weeks = date2.weeks(from: date1)     // 39
let days = date2.days(from: date1)       // 273
let hours = date2.hours(from: date1)     // 6,553
let minutes = date2.minutes(from: date1) // 393,180
let seconds = date2.seconds(from: date1) // 23,590,800

let timeOffset = date2.offset(from: date1) // "9M"

let date3 = DateComponents(calendar: .current, year: 2014, month: 11, day: 28, hour: 5, minute: 9).date!
let date4 = DateComponents(calendar: .current, year: 2015, month: 11, day: 28, hour: 5, minute: 9).date!

let timeOffset2 = date4.offset(from: date3) // "1y"

let date5 = DateComponents(calendar: .current, year: 2017, month: 4, day: 28).date!
let now = Date()
let timeOffset3 = now.offset(from: date5) // "1w"

关于ios - 在 Swift 中获取两个日期(月/日/小时/分钟/秒)之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43264134/

相关文章:

ios - 停止从 textView 中获取文本

macos - 如何在Shell中多行定义数组

objective-c - Log4xx 作为 Cocoa 框架?

objective-c - QLPreviewController 因大文档而崩溃

ios - 在 ImageView 上绘制矩形。图像未正确缩放 - iOS

objective-c - MsgPack 无法消息打包 NSData 对象

macos - NSScrollView,弹性和在 View 边界之外绘制

ios - 如何在 Swift 中为 UIImages 创建闪烁的指针效果

ruby - 在 Swift 中生成强力球选秀权的一行?

ios - 如何用倾斜的渐变填充 CAShapeLayer