没有时间组件的NSDate比较

86
在 Swift Playground 中,我一直在使用:
NSDate.date() 

但是,这通常会附加时间元素。对于我的应用程序,我需要忽略时间元素。在Swift中是否有可能实现?如何做到?即使我可以将时间元素设置为每个日期上相同的时间,那也可以。

此外,我正在尝试比较两个日期,目前我正在使用以下代码:

var earlierDate:NSDate = firstDate.earlierDate(secondDate)

这是唯一的方法吗?还是有另一种方式可以忽略时间元素?比如说,我不想在同一天但不同时间得到结果。


1
你不想“忽略”对象的时间部分。看起来你想将日期格式化为没有时间部分的字符串。你可以使用NSDateFormatter来实现这个目的。 - The Paramagnetic Croissant
17个回答

2

对于Swift3

var order = NSCalendar.current.compare(firstDate, to: secondDate, toGranularity: .hour)

if order == .orderedSame {
    //Both the dates are same. 
    //Your Logic.
}

1

Swift:

extension NSDate {

    /**
    Compares current date with the given one down to the seconds.
    If date==nil, then always return false

    :param: date date to compare or nil

    :returns: true if the dates has equal years, months, days, hours, minutes and seconds.
    */
    func sameDate(date: NSDate?) -> Bool {
        if let d = date {
            let calendar = NSCalendar.currentCalendar()
            if NSComparisonResult.OrderedSame == calendar.compareDate(self, toDate: d, toUnitGranularity: NSCalendarUnit.SecondCalendarUnit) {
                return true
            }

        }
        return false
    }
}

0
如果您只需要比较日期是否与其他日期在同一天,请使用以下代码:
Calendar.current.isDate(date1, inSameDayAs: date2)

0
在我的经验中,大多数人使用NSDate时遇到的问题都来自于错误的假设,即NSDate可以用于表示“正常”意义上的日期(即从当地时区午夜开始的24小时时间段)。在正常(日常/非编程)使用中,伦敦的2014年1月1日与北京或纽约的1月1日是相同的日期,尽管它们覆盖了不同的实际时间段。将其推向极端,圣诞岛的时间是UTC+14,而中途岛的时间是UTC-11。因此,这两个岛屿上的2014年1月1日是相同的日期,即使一个岛屿的时间还没有开始,另一个岛屿已经完成了一个小时。
如果您正在记录这种类型的日期(如果您没有记录时间组件,则可能是这种情况),则不要使用NSDate(它仅存储自2001-01-01 00:00 UTC以来的秒数,没有其他内容),而是将年份、月份和日期作为整数进行存储 - 可能通过创建自己的CivilDate类来包装这些值 - 并使用它代替。
只有在比较日期时才会涉及NSDate,然后确保在比较目的上明确声明时区为“UTC”的两个NSDate。

0
当你在playground中使用NSDate.date(),你会看到打印出默认描述。使用NSDateFormatter打印该日期对象的本地化描述,可能只包含日期部分。
为了将日期的特定部分清零(以进行比较),请结合使用NSDateComponentsNSCalendar

啊,开玩笑吧,字符串操作? - vikingosegundo
这并没有帮助,因为我知道如何打印本地化的描述而不包含时间元素。我想忽略时间元素,因为我需要比较两个日期而不受时间干扰。 - agf119105
在这种情况下,使用 NSDateComponents - Léo Natan

-1

Swift 4

func compareDate(date1:Date, date2:Date) -> Bool {
    let order = Calendar.current.compare(date1, to: date2,toGranularity: .day)
    switch order {
    case .orderedSame:
        return true
    default:
        return false
    }
}

这是@zs2020在18个月前回答的完全一样的副本。 - Ashley Mills

-3
回答你的问题:
“这在Swift中可行吗?”
是的,这是可能的。

啊,你也想知道如何

let cal = NSCalendar.currentCalendar()
cal.rangeOfUnit(.DayCalendarUnit, startDate: &d1, interval: nil, forDate: d1) // d1 NSDate?
cal.rangeOfUnit(.DayCalendarUnit, startDate: &d2, interval: nil, forDate: d2) // d2 NSDate?

现在d1和d2将包含它们所在日期的开始时间。

d1!.compare(d2!)进行比较

要显示它们不带时间部分,请使用NSDateFormatter。


2
谢谢,你能回答“如何”吗?!? - agf119105
请使用Google,例如@agf119105。 - The Paramagnetic Croissant
2
它回答了问题,就像它的措辞一样,不是吗? - vikingosegundo
2
问题的措辞是:“在Swift中是否可能?如何实现?”意思是需要哪些代码?@user3477950尝试了谷歌,但对于Swift没有有用的结果... - agf119105

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接