使用swift 3和xcode 8在几周和几天中的两个日期之间的差异

For*_*One 31 date-comparison swift

我试图计算两个日期之间的差异(一个是当前日期,另一个是来自datepicker),在几周和几天然后在标签上显示结果,这是我到目前为止所做的,我感谢更有经验的开发人员的帮助这里!

let EDD = datePicker.date
let now = NSDate()

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .short
formatter.allowedUnits = [.day]
formatter.maximumUnitCount = 2   

let string = formatter.string (from: now as Date, to: EDD)

label.text = string
Run Code Online (Sandbox Code Playgroud)

Ash*_*lls 54

您可以使用Calendar's dateComponents(_:from:to:)来查找2个日期与所需单位之间的差异.

例:

let dateRangeStart = Date()
let dateRangeEnd = Date().addingTimeInterval(12345678)
let components = Calendar.current.dateComponents([.weekOfYear, .month], from: dateRangeStart, to: dateRangeEnd)

print(dateRangeStart)
print(dateRangeEnd)
print("difference is \(components.month ?? 0) months and \(components.weekOfYear ?? 0) weeks")


> 2017-02-17 10:05:19 +0000
> 2017-07-10 07:26:37 +0000
> difference is 4 months and 3 weeks

let months = components.month ?? 0
let weeks = components.weekOfYear ?? 0
Run Code Online (Sandbox Code Playgroud)


Mar*_*n R 12

你很亲密 只需添加.weekOfMonth(根据API文档,意思是"周数")到允许的单位.例:

let now = Date()
let endDate = now.addingTimeInterval(24 * 3600 * 17)

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.day, .weekOfMonth]
formatter.unitsStyle = .full
let string = formatter.string(from: now, to: endDate)!

print(string) // 2 weeks, 3 days
Run Code Online (Sandbox Code Playgroud)

设置maximumUnitCount = 2不是必需的,因为只有两个允许的单位.


Amr*_*gry 5

斯威夫特 4

使用 Xcode 9.2 版进行测试

  • 结合以上两个答案对我有帮助

使用以下方法通过两个日期之间的差异获取字符串,想法是按格式本地化单词周/天/分钟。

func getTimeComponentString(olderDate older: Date,newerDate newer: Date) -> (String?)  {
    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .full

    let componentsLeftTime = Calendar.current.dateComponents([.minute , .hour , .day,.month, .weekOfMonth,.year], from: older, to: newer)

    let year = componentsLeftTime.year ?? 0
    if  year > 0 {
        formatter.allowedUnits = [.year]
        return formatter.string(from: older, to: newer)
    }


    let month = componentsLeftTime.month ?? 0
    if  month > 0 {
        formatter.allowedUnits = [.month]
        return formatter.string(from: older, to: newer)
    }

    let weekOfMonth = componentsLeftTime.weekOfMonth ?? 0
    if  weekOfMonth > 0 {
        formatter.allowedUnits = [.weekOfMonth]
        return formatter.string(from: older, to: newer)
    }

    let day = componentsLeftTime.day ?? 0
    if  day > 0 {
        formatter.allowedUnits = [.day]
        return formatter.string(from: older, to: newer)
    }

    let hour = componentsLeftTime.hour ?? 0
    if  hour > 0 {
        formatter.allowedUnits = [.hour]
        return formatter.string(from: older, to: newer)
    }

    let minute = componentsLeftTime.minute ?? 0
    if  minute > 0 {
        formatter.allowedUnits = [.minute]
        return formatter.string(from: older, to: newer) ?? ""
    }

    return nil
}
Run Code Online (Sandbox Code Playgroud)

这是您可以使用的方法

    let nowDate = Date()
    let endDate = Date().addingTimeInterval(12345678)

    let string =  String.getTimeComponentString(olderDate: nowDate, newerDate: endDate)!
    print(nowDate)
    print(endDate)
    print(string)
Run Code Online (Sandbox Code Playgroud)
  • 输出

  • 2018-03-08 08:11:22 +0000
  • 2018-07-29 05:32:41 +0000
  • 4个月


MAL*_*MAN 5

斯威夫特 4,5

您可以使用这一行代码找到数周内不同的日期。

let totalWeeks = Calendar.current.dateComponents([.weekOfMonth], from: Date(), to: endDate).weekOfMonth!

//for totalDays
let totalDays = Calendar.current.dateComponents([.day], from: Date(), to: endDate).day!
Run Code Online (Sandbox Code Playgroud)