【问题标题】:How to compare NSDate to check if dates are within the same week如何比较 NSDate 以检查日期是否在同一周内
【发布时间】:2015-04-11 21:05:19
【问题描述】:

我有两个 NSDate。我如何比较它们以确定日期是否在同一周内。

我有一个系统,目前检查两个日期是否在同一天,代码如下:

if calan.compareDate(datee, toDate: now, toUnitGranularity: .CalendarUnitDay) == .OrderedSame {
    transactionsToday.addObject(transaction)
}else{
    println("No transactions today")
}

我将使用哪个 UnitGranularity 来检查这两个日期是否在同一周?

【问题讨论】:

  • 您要检查两个日期是在同一周内还是在一周内。 saturday 和下一个 tuesday 是否应该被认为是真实的(它们在彼此之间的一周内)或者它是否应该返回错误,因为它们在不同的几周内

标签: swift nsdate


【解决方案1】:
if calan.compareDate(datee, toDate: now, toUnitGranularity: .CalendarUnitWeekOfYear) == .OrderedSame {
    transactionsToday.addObject(transaction)
}else{
    println(“No transactions this week")
}

和你现在使用.CalendarUnitDay一样你也可以使用.CalendarUnitWeekOfYear

编辑:
如果您想检查日期是否在一周内而不是在同一周内,您可以获得 last- 和 nextWeekDate

let lastWeekDate = NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitWeekOfYear, value: -1, toDate: NSDate(), options: nil)!

当然是下周

let nextWeekDate = NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitWeekOfYear, value: 1, toDate: NSDate(), options: nil)!

然后您可以查看您当前的日期是否在这两个日期之间

【讨论】:

  • 据我所知,compareDate() 甚至可以跨“年份界限”正常工作。
  • @Martin let today = NSDate() let nextWeek = NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitYear, value: 1, toDate: NSDate(), options: nil)! let weekOfYear1 = calendar!.component(NSCalendarUnit.CalendarUnitWeekOfYear, fromDate: today) let weekOfYear2 = calendar!.component(NSCalendarUnit.CalendarUnitWeekOfYear, fromDate: nextWeek) if (weekOfYear1 == weekOfYear2) { println("Same week") } else { println(“Other week") } 不考虑年份,如果你取明年相同的日期将被视为同一周
  • 我的意思是calan.compareDate(datee, toDate: now, toUnitGranularity: .CalendarUnitWeekOfYear) 工作正常...
  • 您提到的代码确实可以正常工作,但提取一年中的星期组件未通过测试
  • 对于 Swift3,避免使用 NSCalendar。请改用日历。例如:let lastWeekDate = Calendar.current.date(byAdding: .weekOfYear, value: -1, to: Date())
【解决方案2】:

如果您使用公历,则可以使用计算一年中的星期并获取这两个日期的年份然后进行比较。

let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)

let date1 = NSDate(timeIntervalSinceNow: 0)
let date2 = NSDate(timeIntervalSinceNow: -10*24*60*60) //10 day earlier.

let weekOfYear1 = calendar!.component(NSCalendarUnit.CalendarUnitWeekOfYear, fromDate: date1)
let weekOfYear2 = calendar!.component(NSCalendarUnit.CalendarUnitWeekOfYear, fromDate: date2)

let year1 = calendar!.component(NSCalendarUnit.CalendarUnitYear, fromDate: date1)
let year2 = calendar!.component(NSCalendarUnit.CalendarUnitYear, fromDate: date2)

if (weekOfYear1 == weekOfYear2
     && year1 == year2
) {
     NSLog("Same week")
} else {
     NSLog("Other week")
}

【讨论】:

  • 这不适用于同一周和不同年份的日期,例如 2015 年 12 月 31 日和 2016 年 1 月 1 日。但这是一个好方法。
  • 您可以先添加检查 2 个日期是否为同一年。如果不相同则返回“false”,如果是同一年则继续检查此代码。
  • 是的,我使用你的方法来计算同一年内的日期,因为它是更快的方法。如果不是,我搜索两个日期中的最后一个进行比较,然后搜索一周的第一天,然后检查两个日期中的第一个日期是否在一周的第一天之后。它可能看起来有点复杂,但我已经有了获得一周第一天的方法。
【解决方案3】:

Swift5

我写了一个小扩展来简化这个过程:

extension Date {
    func isTheSame(_ component: Calendar.Component, as date: Date) -> Bool {
        return Calendar.current.compare(self, to: date, toGranularity: component) == .orderedSame
    }
}

然后您可以简单地执行以下操作:

if firstDate.isTheSame(.week, as: secondDate) {
    // Both dates are the same week
} else {
    // Dates are different weeks
}

(适用于任何类别,例如:.day、.month、.year 等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2011-12-03
    • 2014-11-05
    相关资源
    最近更新 更多