使用Swift进行NSDate比较

使用Swift进行NSDate比较,swift,nsdate,xcode6,Swift,Nsdate,Xcode6,我正在开发一个应用程序,需要检查作业的截止日期。我想知道到期日是否在下周内,是否在下周内,然后执行操作。 我能找到的大多数文档都是Objective-C,我不知道如何在Swift中实现它。 谢谢你的帮助 这是您在Swift中比较两个NSDATE的方式,我刚刚在Xcode的游乐场中对其进行了测试: if date1.compare(date2) == NSComparisonResult.OrderedDescending { NSLog("date1 after date2"); } e

我正在开发一个应用程序,需要检查作业的截止日期。我想知道到期日是否在下周内,是否在下周内,然后执行操作。
我能找到的大多数文档都是Objective-C,我不知道如何在Swift中实现它。
谢谢你的帮助

这是您在Swift中比较两个NSDATE的方式,我刚刚在Xcode的游乐场中对其进行了测试:

if date1.compare(date2) == NSComparisonResult.OrderedDescending
{
    NSLog("date1 after date2");
} else if date1.compare(date2) == NSComparisonResult.OrderedAscending
{
    NSLog("date1 before date2");
} else
{
    NSLog("dates are equal");
}
因此,要检查日期
dueDate
是否在一周之内,请执行以下操作:

let dueDate=...

let calendar = NSCalendar.currentCalendar()
let comps = NSDateComponents()
comps.day = 7
let date2 = calendar.dateByAddingComponents(comps, toDate: NSDate(), options: NSCalendarOptions.allZeros)

if dueDate.compare(date2!) == NSComparisonResult.OrderedDescending
{
    NSLog("not due within a week");
} else if dueDate.compare(date2!) == NSComparisonResult.OrderedAscending
{
    NSLog("due within a week");
} else
{
    NSLog("due in exactly a week (to the second, this will rarely happen in practice)");
}

如果您想支持
=
=
=
,只需在某个地方声明:

public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs === rhs || lhs.compare(rhs) == .OrderedSame
}

public func <(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.compare(rhs) == .OrderedAscending
}

extension NSDate: Comparable { }
public func==(lhs:NSDate,rhs:NSDate)->Bool{
返回lhs==rhs | | lhs.compare(rhs)==OrderedSame
}
公共职能部门{
返回lhs.compare(rhs)=.OrderedAscending
}
扩展日期:可比{}

Swift

let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
let files = NSFileManager.defaultManager().contentsOfDirectoryAtPath(documentsPath, error: nil)

let filesAndProperties = NSMutableArray()
for file in files! {

    let filePath = documentsPath.stringByAppendingString(file as NSString)
    let properties = NSFileManager.defaultManager().attributesOfItemAtPath(filePath, error: nil)
    let modDate = properties![NSFileModificationDate] as NSDate
    filesAndProperties.addObject(NSDictionary(objectsAndKeys: file, "path", modDate, "lastModDate"))
}

let sortedFiles = filesAndProperties.sortedArrayUsingComparator({
    (path1, path2) -> NSComparisonResult in

    var comp = (path1.objectForKey("lastModDate") as NSDate).compare(path2.objectForKey("lastModDate") as NSDate)
    if comp == .OrderedDescending {

        comp = .OrderedAscending
    } else if comp == .OrderedAscending {

        comp = .OrderedDescending
    }

    return comp
})

我喜欢使用扩展来提高代码的可读性。下面是一些NSDate扩展,可以帮助清理代码并使其易于理解。我把它放在sharedCode.swift文件中:

extension NSDate {

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

        //Compare Values
        if self.compare(dateToCompare as Date) == ComparisonResult.orderedDescending {
            isGreater = true
        }

        //Return Result
        return isGreater
    }

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

        //Compare Values
        if self.compare(dateToCompare as Date) == ComparisonResult.orderedAscending {
            isLess = true
        }

        //Return Result
        return isLess
    }

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

        //Compare Values
        if self.compare(dateToCompare as Date) == ComparisonResult.orderedSame {
            isEqualTo = true
        }

        //Return Result
        return isEqualTo
    }

    func addDays(daysToAdd: Int) -> NSDate {
        let secondsInDays: TimeInterval = Double(daysToAdd) * 60 * 60 * 24
        let dateWithDaysAdded: NSDate = self.addingTimeInterval(secondsInDays)

        //Return Result
        return dateWithDaysAdded
    }

    func addHours(hoursToAdd: Int) -> NSDate {
        let secondsInHours: TimeInterval = Double(hoursToAdd) * 60 * 60
        let dateWithHoursAdded: NSDate = self.addingTimeInterval(secondsInHours)

        //Return Result
        return dateWithHoursAdded
    }
}
现在,如果您可以这样做:

//Get Current Date/Time
var currentDateTime = NSDate()

//Get Reminder Date (which is Due date minus 7 days lets say)
var reminderDate = dueDate.addDays(-7)

//Check if reminderDate is Greater than Right now
if(reminderDate.isGreaterThanDate(currentDateTime)) {
    //Do Something...
}
if thisDate.compareTo(date: Date(), toGranularity: .day) == .orderedDescending {
// thisDate is a previous day
}

我总是用一句话来表达:

let greater = date1.timeIntervalSince1970 < date2.timeIntervalSince1970
let morer=date1.timeIntervalSince1970

if
块中仍然可读

我们有两次(两个日期)检查当前时间间隔的场景。例如,我想检查诊所(医院)开放时间和关闭时间之间的当前间隔

extension NSDate {

    // MARK: - Dates comparison

    func isGreaterThanDate(dateToCompare: NSDate) -> Bool {

        return self.compare(dateToCompare) == NSComparisonResult.OrderedDescending
    }

    func isLessThanDate(dateToCompare: NSDate) -> Bool {

        return self.compare(dateToCompare) == NSComparisonResult.OrderedAscending
    }

    func equalToDate(dateToCompare: NSDate) -> Bool {

        return self.compare(dateToCompare) == NSComparisonResult.OrderedSame
    }
}
使用简单的代码

      NSDate * now = [NSDate date];
        NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
        [outputFormatter setDateFormat:@"HH:mm:ss"];

        //current time
        NSString *currentTimeString = [outputFormatter stringFromDate:now];
        NSDate *dateCurrent = [outputFormatter dateFromString:currentTimeString];


        NSString *timeStart = @"09:00:00";
        NSString *timeEnd = @"22:00:00";

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"HH:mm:ss"];

        NSDate *dateStart= [formatter timeStart];
        NSDate *dateEnd = [formatter timeEnd];
        NSComparisonResult result = [dateCurrent compare:dateStart];
        NSComparisonResult resultSecond = [date2 compare:dateEnd];

if(result == NSOrderedDescending && resultSecond == NSOrderedDescending)
        {
            NSLog(@"current time lies in starting and end time");
    }else {
            NSLog(@"current time doesn't lie in starting and end time");
        }

如果您想比较swift 3上的日期与粒度(仅同一天或同一年等)

func compareDate(date1:NSDate, date2:NSDate, toUnitGranularity: NSCalendar.Unit) -> Bool {

 let order = NSCalendar.current.compare(date1 as Date, to: date2 as Date, toGranularity: .day)
 switch order {
 case .orderedSame:
   return true
 default:
   return false
 }
}
对于其他日历比较,更改为天

.年 .月 白天 .小时 .分钟
.第二

在Swift3中,
基础
中的
日期
结构现在实现了
可比
协议。因此,以前的Swift2
NSDate
方法被Swift3
Date
取代

/**
 `Date` represents a single point in time.

 A `Date` is independent of a particular calendar or time zone. To represent a `Date` to a user, you must interpret it in the context of a `Calendar`.
*/
public struct Date : ReferenceConvertible, Comparable, Equatable {

    // .... more         

    /**
        Returns the interval between the receiver and another given date.

        - Parameter another: The date with which to compare the receiver.

        - Returns: The interval between the receiver and the `another` parameter. If the receiver is earlier than `anotherDate`, the return value is negative. If `anotherDate` is `nil`, the results are undefined.

        - SeeAlso: `timeIntervalSince1970`
        - SeeAlso: `timeIntervalSinceNow`
        - SeeAlso: `timeIntervalSinceReferenceDate`
        */
    public func timeIntervalSince(_ date: Date) -> TimeInterval

   // .... more 

    /// Returns true if the two `Date` values represent the same point in time.
    public static func ==(lhs: Date, rhs: Date) -> Bool

    /// Returns true if the left hand `Date` is earlier in time than the right hand `Date`.
    public static func <(lhs: Date, rhs: Date) -> Bool

    /// Returns true if the left hand `Date` is later in time than the right hand `Date`.
    public static func >(lhs: Date, rhs: Date) -> Bool

    /// Returns a `Date` with a specified amount of time added to it.
    public static func +(lhs: Date, rhs: TimeInterval) -> Date

    /// Returns a `Date` with a specified amount of time subtracted from it.
    public static func -(lhs: Date, rhs: TimeInterval) -> Date

  // .... more
}

对于swift 3,您可以使用以下功能比较两个日期

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

toGranularity可以根据要应用比较的约束进行更改

在Swift 3中,日期是可比较的,因此我们可以直接比较日期,如

let date1 = Date()
let date2 = Date()

let isGreater = date1 > date2
print(isGreater)

let isEqual = date1 == date2
print(isEqual)
或者

let result = date1.compare(date2)
switch result {
    case .OrderedAscending     :   print("date 1 is earlier than date 2")
    case .OrderedDescending    :   print("date 1 is later than date 2")
    case .OrderedSame          :   print("two dates are the same")
}
在日期上创建扩展名的更好方法

extension Date {

  fun isGreater(than date: Date) -> Bool {
    return self > date 
  }

  func isSmaller(than date: Date) -> Bool {
    return self < date
  }

  func isEqual(to date: Date) -> Bool {
    return self == date
  }

}
延期日期{
乐趣大于(比日期:日期)->Bool{
返回自我>日期
}
func isSmaller(比日期:日期)->Bool{
返回自我<日期
}
func isEqual(到目前为止:日期)->Bool{
返回自我==日期
}
}

用法
let isbether=date1.isbether(than:date2)

此函数用于比较一个日期(startDate)是否在endDate之后,其中两个日期都定义为NSDate变量:

if startDate.compare(endDate as Date) == ComparisonResult.orderedDescending

Swift已经实现了日期比较,只需使用date1>date2等等

/// Returns true if the two `Date` values represent the same point in time.
public static func ==(lhs: Date, rhs: Date) -> Bool

/// Returns true if the left hand `Date` is earlier in time than the right hand `Date`.
public static func <(lhs: Date, rhs: Date) -> Bool

/// Returns true if the left hand `Date` is later in time than the right hand `Date`.
public static func >(lhs: Date, rhs: Date) -> Bool

/// Returns a `Date` with a specified amount of time added to it.
public static func +(lhs: Date, rhs: TimeInterval) -> Date

/// Returns a `Date` with a specified amount of time subtracted from it.
public static func -(lhs: Date, rhs: TimeInterval) -> Date

/// Add a `TimeInterval` to a `Date`.
///
/// - warning: This only adjusts an absolute value. If you wish to add calendrical concepts like hours, days, months then you must use a `Calendar`. That will take into account complexities like daylight saving time, months with different numbers of days, and more.
public static func +=(lhs: inout Date, rhs: TimeInterval)

/// Subtract a `TimeInterval` from a `Date`.
///
/// - warning: This only adjusts an absolute value. If you wish to add calendrical concepts like hours, days, months then you must use a `Calendar`. That will take into account complexities like daylight saving time, months with different numbers of days, and more.
public static func -=(lhs: inout Date, rhs: TimeInterval)
///如果两个'Date'值表示相同的时间点,则返回true。
公共静态函数==(左:日期,右:日期)->Bool
///如果左侧的“日期”早于右侧的“日期”,则返回true。
公共静态函数库
///如果左侧的“日期”晚于右侧的“日期”,则返回true。
公共静态函数>(左:日期,右:日期)->Bool
///返回添加了指定时间量的“日期”。
公共静态函数+(左:日期,右:时间间隔)->日期
///返回一个'Date',并从中减去指定的时间量。
公共静态函数-(左:日期,右:时间间隔)->日期
///将“时间间隔”添加到“日期”。
///
///-警告:这仅调整绝对值。如果您希望添加日历概念,如小时、天、月,则必须使用“日历”。这将考虑到诸如夏令时、不同天数的月份等复杂性。
公共静态函数+=(左:输入输出日期,右:时间间隔)
///从“日期”中减去“时间间隔”。
///
///-警告:这仅调整绝对值。如果您希望添加日历概念,如小时、天、月,则必须使用“日历”。这将考虑到诸如夏令时、不同天数的月份等复杂性。
公共静态函数-=(左:输入输出日期,右:时间间隔)

在SashaZ-Swift iOS 8及更高版本上扩展

  • 这些日期是同一天的吗
  • 这些日期是同一个月的吗
  • 这是上个月的日期吗
当您需要的不仅仅是更大或更小的日期比较时。例如,是同一天还是前一天

注意:永远不要忘记时区。日历时区有一个默认值,但是如果您不喜欢默认值,您必须自己设置时区。要知道今天是哪一天,你需要知道你在问哪个时区

extension Date {
    func compareTo(date: Date, toGranularity: Calendar.Component ) -> ComparisonResult  {
        var cal = Calendar.current
        cal.timeZone = TimeZone(identifier: "Europe/Paris")!
        return cal.compare(self, to: date, toGranularity: toGranularity)
        }
    }
像这样使用它:

//Get Current Date/Time
var currentDateTime = NSDate()

//Get Reminder Date (which is Due date minus 7 days lets say)
var reminderDate = dueDate.addDays(-7)

//Check if reminderDate is Greater than Right now
if(reminderDate.isGreaterThanDate(currentDateTime)) {
    //Do Something...
}
if thisDate.compareTo(date: Date(), toGranularity: .day) == .orderedDescending {
// thisDate is a previous day
}
一个更复杂的例子。查找并筛选数组中与“findThisDay”同一天的所有日期:


swift没有您使用的日期类Objective NSC date类-因此您找到了正确的文档可能的副本。有很多非常好的答案。相关的答案:Swift 3确实有一个
日期
类。它被桥接到
NSDate
,但它被称为
Date
。按顺序降序是否意味着date1>date2?是的,@Henryoscannlain-miller。您应该简化代码
return self.compare(dateToCompare)==NSComparisonResult.OrderedDescending
isEqualToDate也由Apple提供。它的声明与苹果定义的声明相冲突。不是每天都有24小时。这个答案很糟糕,永远不应该被接受。永远不要将时间间隔添加到您创建的日期中。这正是
NSDateComponents
存在的原因。有许多边缘情况没有得到正确处理,不将一致性添加到
Comparable
NSDate
是没有意义的。我建议使用。一个更好的解决方案是使NSDate相等
extension Date {
    func compareTo(date: Date, toGranularity: Calendar.Component ) -> ComparisonResult  {
        var cal = Calendar.current
        cal.timeZone = TimeZone(identifier: "Europe/Paris")!
        return cal.compare(self, to: date, toGranularity: toGranularity)
        }
    }
if thisDate.compareTo(date: Date(), toGranularity: .day) == .orderedDescending {
// thisDate is a previous day
}
let formatter = DateFormatter()
formatter.timeZone = TimeZone(identifier: "Europe/Paris")
formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"

let findThisDay = formatter.date(from: "2018/11/05 08:11:08")!
_ = [
    formatter.date(from: "2018/12/05 08:08:08")!, 
    formatter.date(from: "2018/11/05 08:11:08")!,
    formatter.date(from: "2018/11/05 11:08:22")!,
    formatter.date(from: "2018/11/05 22:08:22")!,
    formatter.date(from: "2018/11/05 08:08:22")!,
    formatter.date(from: "2018/11/07 08:08:22")!,
    ]
    .filter{ findThisDay.compareTo(date: $0 , toGranularity: .day) == .orderedSame }
    .map { print(formatter.string(from: $0)) }