【问题标题】:Comparing two NSDates day, month and year integers比较两个 NSDates 日、月和年整数
【发布时间】:2015-08-23 19:20:45
【问题描述】:

我正在尝试比较两个 NSDate 以了解它们是否在同一天。这是两个日期(第二个总是当前日期,NSDate()):

2015-08-23 22:00:00 +0000 2015-08-23 19:13:45 +0000

日期显然是在同一天,因为 23 = 23。但是我似乎无法在代码中确定这一点。我试过了:

1)

let date = tripObject["tripDate"] as! NSDate
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let str = dateFormatter.stringFromDate(date)

let date2 = NSDate()
let dateFormatter2 = NSDateFormatter()
dateFormatter2.dateFormat = "yyyy-MM-dd"
let str2 = dateFormatter2.stringFromDate(date2)

println(". \(str) and \(str2) .")

这给出了 2015-08-24 和 2015-08-23

2)

let dateComponents = NSCalendar.currentCalendar().components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: tripObject["tripDate"] as! NSDate)
let dateComponents2 = NSCalendar.currentCalendar().components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: NSDate())

这给出了不同的一天组成部分。

3)

if NSCalendar.currentCalendar().isDate(firstDate!, inSameDayAsDate: secondDate!){ 

4)

if NSCalendar.currentCalendar().isDateInToday(the NSDate) {

3 和 4 都失败了。

我完全迷路了,有什么想法吗?

【问题讨论】:

  • 使用 NSCalendar.currentCalendar().startOfDayForDate(date) 获取一天的开始日期和使用比较方法
  • 失败是什么意思?日期中的时间是几点?

标签: ios swift


【解决方案1】:

NSCalendar 有一个方法 isDate:equalToDate:toUnitGranularity: 可以满足您的需要

date1date2是要比较的NSDate实例,结果是Bool

let calendar = NSCalendar.currentCalendar()
calendar.timeZone = NSTimeZone(forSecondsFromGMT: 0)
let datesAreInTheSameDay = calendar.isDate(date1, equalToDate: date2, toUnitGranularity: .CalendarUnitDay | .CalendarUnitMonth | .CalendarUnitYear)

斯威夫特 2:

let datesAreInTheSameDay = calendar.isDate(date1, equalToDate: date2, toUnitGranularity: [.Day, .Month, .Year])

斯威夫特 3:

var calendar = Calendar.current
calendar.timeZone = TimeZone(secondsFromGMT: 0)!
let datesAreInTheSameDay = calendar.isDate(date1, equalTo: date2, toGranularity:.day)

【讨论】:

  • 我尝试了第一行,它仍然不起作用.. 似乎无论我在第 23 天做什么都会变成 24
  • 日期1:2015-08-23 22:00:00 +0000,日期2:2015-08-23 20:56:30 +0000
  • 代码应该可以工作,检查日期的时区
  • 不应该考虑时间日期
  • @JAHelia 还有一种方法calendar.isDate(date1, inSameDayAs: date2)
【解决方案2】:

您可以将两个日期转换为一天的开始,然后使用NSDatecompare 方法进行比较

   let date1StartOfTheDay = NSCalendar.currentCalendar().startOfDayForDate(date)
   let date2StartOfTheDay = NSCalendar.currentCalendar().startOfDayForDate(date2
   if date1StartOfTheDay.compare(date2StartOfTheDay) == OrderedSame
   {
       //same dates
    }

【讨论】:

  • 试过这个,给。 2015-08-23 22:00:00 +0000 和 2015-08-22 22:00:00 +0000。其中 08-22 是 date2 或 NSDate(),即使今天是 23 日。如果我只打印 NSDate() 它会给出 2015-08-23 19:46:46 +0000
  • 你能打印日期看看打印的内容吗,我想可能是时区问题
  • 日期 = 2015-08-23 22:00:00 +0000
【解决方案3】:

你可以使用这个扩展:

extension NSDate {

    func isEqualToDate2(dateToCompare : NSDate) -> Bool {
        //Declare Variables
        var isEqualTo = false

        //Compare Values
        if self.compare(dateToCompare) == NSComparisonResult.OrderedSame {
            isEqualTo = true
        }

        //Return Result
        return isEqualTo
    }

}

喜欢:

if date1.isEqualToDate2(date2) {
...
}

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多