সুইফট ব্যবহার করে এনএসডিট তুলনা


153

আমি একটি অ্যাপ্লিকেশনটিতে কাজ করছি যাতে হোমওয়ার্কের জন্য নির্ধারিত তারিখটি পরীক্ষা করা প্রয়োজন। আমি জানতে চাই যে কোনও নির্ধারিত তারিখটি পরবর্তী সপ্তাহের মধ্যে রয়েছে এবং যদি এটি কোনও পদক্ষেপ নেওয়া হয়।
আমি যে ডকুমেন্টেশন খুঁজে পেতে পারি তার বেশিরভাগটি অবজেক্টিভ-সি-তে রয়েছে এবং আমি কীভাবে সুইফটে এটি করব তা অনুমান করতে পারি না। সাহায্যের জন্য ধন্যবাদ!!


2
অবজেক্টিভ সি এনএসডিট ক্লাসটি ব্যবহার করার জন্য সুইফ্টের কোনও তারিখ শ্রেণি নেই - সুতরাং আপনি সঠিক ডকুমেন্টেশনটি খুঁজে পেয়েছেন
মিমি মিমি

সময় উপাদান ছাড়াই এনএসডিটসের তুলনা করার সম্ভাব্য সদৃশ । খুব ভাল উত্তর প্রচুর আছে।
jww

সংশ্লিষ্ট উত্তর: stackoverflow.com/questions/29652771/...
jkdev

2
সুইফট 3 এর একটি Dateক্লাস রয়েছে। এটি ব্রিজ করা হয় NSDate, তবে এটি বলা হয় Date
বলপয়েন্টবেন

উত্তর:


188

কোডটি আরও পঠনযোগ্য করার জন্য আমি এক্সটেনশনগুলি ব্যবহার করতে চাই। এখানে কয়েকটি এনএসডিট এক্সটেনশান রয়েছে যা আপনার কোড পরিষ্কার করতে এবং এটি বুঝতে সহজ করে তুলতে সহায়তা করতে পারে। আমি এটি একটি শেয়ারডকোড.সুইফ্ট ফাইলে রেখেছি:

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...
}

28
আপনার কোডটি সহজ করা উচিত। return self.compare(dateToCompare) == NSComparisonResult.OrderedDescending
ওলাভ গৌসেকার

5
isEqualToDate অ্যাপল দ্বারা সরবরাহ করা হয়। এটি অ্যাপল দ্বারা সংজ্ঞায়িত একটির সাথে ঘোষণাপত্রের দ্বন্দ্ব।
শামাস এস - মনিকা

4
প্রতিদিনের 24 ঘন্টা নেই
লিও ডাবাস

9
এই উত্তরটি ভয়ানক এবং কখনই গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। আপনার দ্বারা তৈরি করা তারিখগুলিতে কখনও কখনও সময় বিরতি যুক্ত করবেন না । ঠিক এ কারণেই তা NSDateComponentsবিদ্যমান। সেখানে প্রান্ত মামলা যে হ্যান্ডেল সঠিকভাবে হচ্ছে না অনেক আছে এবং এটি অনুরূপ যোগ করতে কোন জ্ঞান করে তোলে Comparableকরতে NSDate। আমি জন এর সমাধান ব্যবহার করার পরামর্শ দিই ।
fpg1503

3
আরও ভাল সমাধান হ'ল এনএসডিটকে সমতুল্য, তুলনীয় করে তোলা, তবে আপনি date1 < date2
সহজভাবেই

209

আপনাকে সমর্থন করতে চান, ==, <, >, <=, অথবা >=জন্য NSDateS, আপনি শুধুমাত্র এই কোথাও ডিক্লেয়ার করতে হবে:

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 { }

2
@ ইসুরু গুরু প্রোটোকলের Comparableবংশধর Equatableতাই আপনার দুজনের কাছেই কনফার্মেশন ঘোষণা করার দরকার নেই।
জন এস্ট্রোপিয়া

2
শুধু কৌতূহল কেন এটি ডিফল্টরূপে অন্তর্নির্মিত হয় না ?!
ডিভ্যাফিকেশন

3
@dVaffection উদ্দেশ্য সি (যেখানে NSDate এবং বন্ধুদের ঘোষিত হয়), যদি আপনি ব্যবহার তুলনা ==, <, >ইত্যাদি আপনি মেমরি তাদের ঠিকানা, তাদের প্রকৃত মূল্য তুলনা তুলনা ফলে পেয়ে করা হবে। সুইফ্টে, তাদের এখনও রেফারেন্স হিসাবে বিবেচনা করা হয় তাই আমার মনে হয় পছন্দটি হয় (1) ওবিজেসি-তে থাকায় বাই-পয়েন্টার-তুলনা রাখা বা (2) তুলনার জন্য বাস্তবায়ন না দিয়ে বিভ্রান্তি দূর করতে হবে।
জন এস্ট্রোপিয়া

2
এই পদ্ধতির একটি অতিরিক্ত সুবিধা হ'ল Array.maxElement(), ইত্যাদি স্বয়ংক্রিয়ভাবে এনএসডিটসের অ্যারেগুলিতে উপলব্ধ।
pr1001

1
@ মার্সিও ক্রুজ এটি কেবলমাত্র একটি সুইফট প্রয়োজনীয় যে সমস্ত অপারেটর বাস্তবায়ন বিশ্বব্যাপী সুযোগের মধ্যে থাকা উচিত। : এখানে আলোচনা দেখুন stackoverflow.com/questions/35246003/...
জন Estropia

54

আপনি সুইফটে দুটি এনএসডিটকে এইভাবে তুলনা করেন, আমি কেবল এটি এক্সকোডের খেলার মাঠে পরীক্ষা করে দেখেছি:

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)");
}

2
অর্ডার নেওয়ার মানে কি তারিখ 1> তারিখ 2?
হেনরি অস্কান্লেইন-মিলার

1
হ্যাঁ, @ হেনরিওস্কানলাইন-মিলার।
পূর্বাবস্থায় ফিরুন

46

আমি সবসময় এক লাইনে করেছিলাম:

let greater = date1.timeIntervalSince1970 < date2.timeIntervalSince1970

এখনও ifব্লক পাঠযোগ্য


12

Swift3 সালে Dateমধ্যে struct হয় Foundationএখন প্রয়োগ Comparableপ্রোটোকল। সুতরাং, পূর্ববর্তী সুইফট 2 NSDateপদ্ধতিগুলি সুইফট 3 দ্বারা সুপারসেসড হয় 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
}

বিঃদ্রঃ ...

Swift3 সালে Dateহয় structএটা মানে এটা যে, value typeNSDateহয় class, এটা হয় reference type

// Swift3
let a = Date()
let b = a //< `b` will copy `a`. 

// So, the addresses between `a` and `b` are different.
// `Date` is some kind different with `NSDate`.

6
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
    }
}

6

আপনি যদি দ্রুততম 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
 }
}

অন্যান্য ক্যালেন্ডারের তুলনাগুলির জন্য। দিন পরিবর্তন;

.আর .আমতম .দিন .হুর .মিনিট। সেকেন্ড


5

সুইফটি ইতিমধ্যে তারিখ তুলনা বাস্তবায়ন করে কেবল তারিখ 1> তারিখ 2 ব্যবহার করে।

/// 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)

4

সুইফ্ট 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তারিখে তৈরির আরও ভাল উপায়

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
  }

}

ব্যবহার let isGreater = date1.isGreater(than: date2)


3

এই তারিখটি তুলনা করার জন্য আমার পক্ষে কাজ করেছিল যে একটি তারিখ (শুরুর তারিখ) শেষ তারিখের পরে যেখানে উভয়ই এনএসডিট ভেরিয়েবল হিসাবে সংজ্ঞায়িত হয়েছিল:

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

2

বাস্তবায়ন 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
})

2
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateData: String = dateFormatter.stringFromDate(date1)
let testDate: String = dateFormatter.stringFromDate(date2)
print(dateData == testDate)

1
someArray.sort({($0.dateAdded?.timeIntervalSinceReferenceDate)! < ($1.dateAdded?.timeIntervalSinceReferenceDate)!})

ডেটএডেড হ'ল আমার অবজেক্টে একটি এনএসডিট ভেরিয়েবল

class MyClass {
    let dateAdded: NSDate?
}

1

আমাদের বর্তমান সময়টি খ / ডাব্লু দুইবার (দুটি তারিখ) নিরীক্ষণের দৃশ্য আছে। উদাহরণস্বরূপ, আমি ক্লিনিক (হাসপাতাল) খোলার সময় এবং সমাপনী সময়ের মধ্যে বর্তমান মিথ্যাটি পরীক্ষা করতে চাই।

সহজ কোড ব্যবহার করুন।

      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");
        }

1

সুইফ্ট 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 পরিবর্তন করা যেতে পারে।


1

সাশাজেডে প্রসারিত করা

আপনি যখন বড় বা ছোট তারিখের তুলনায় কেবল বেশি প্রয়োজন তখন আইওএস 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)
        }
    }

এটি এর মতো ব্যবহার করুন:

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)) }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.