সুইফট 3 - তারিখের বিষয়গুলির সাথে তুলনা করা


98

আমি আমার অ্যাপটি সুইফট ৩.০ সিনট্যাক্সে আপডেট করছি (আমি জানি এটি এখনও বিটাতে রয়েছে তবে আমি এটি প্রকাশের সাথে সাথে প্রস্তুত হতে চাই)।

Xcode (বিটা 5) পূর্ববর্তী বিটা পর্যন্ত আমি দুই তুলনা করতে সক্ষম হন Dateoperands ব্যবহার বস্তু <, >এবং ==। তবে সর্বশেষ বিটাতে (বিটা 6) এটি আর কাজ করছে না। এখানে কিছু স্ক্রিনশট রয়েছে:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

আপনি উভয় স্ক্রিনশটগুলিতে দেখতে পাচ্ছেন যে এগুলি দুটি Dateবস্তু। তবে আমি নিম্নলিখিত ত্রুটি পেয়েছি: এখানে চিত্র বর্ণনা লিখুন

আমি কি ভুল করছি? কার্যগুলি Dateক্লাসে এখনও ঘোষণা করা হয়েছে :

static func >(Date, Date)

বাম হাতের তারিখ ডান হাতের তারিখের চেয়ে পরে সময় হলে সত্যটি ফেরায়।

এটি কি একটি বিটা বাগ বা আমি কিছু ভুল করছি?


4
let d1 = Date() ; let d2 = Date() ; if d1 > d2 { }আমার এক্সকোড 8 বিটা 6 এ কাজ করে
মার্টিন আর

4
হ্যাঁ. - আপনার প্রতিবেদন নেভিগেটরে সম্পূর্ণ ত্রুটি বার্তাটি অনুসন্ধান করা উচিত।
মার্টিন আর

আপনাকে ধন্যবাদ! মার্টিনআর! আমি জানতাম না যে আমি একটি ত্রুটিতে "ডুব" দিতে পারি এবং আরও তথ্য পেতে পারি। আমাকে অনেক সাহায্য করেছে!
বীফ

সঠিক উত্তরটি গ্রহণ করুন
অঙ্কিত ঠাকুর

উত্তর:


165

আমি এই স্নিপেটটি চেষ্টা করেছি (এক্সকোড 8 বিটা 6 এ), এবং এটি ভাল কাজ করছে।

let date1 = Date()
let date2 = Date().addingTimeInterval(100)

if date1 == date2 { ... }
else if date1 > date2 { ... }
else if date1 < date2 { ... }

যদি আমি সময়কে উপেক্ষা করতে চাই যেমন 2019-05-14 12:08:14 +0000== 2019-05-14সত্য হওয়া উচিত return তারপর কি ?
ওবাইস ফায়াজ

@ আওসফায়াজ যদি আপনি তারিখের উপাদানটিকে বিবেচনায় না নিয়ে তারিখের তুলনা করতে চান। তারিখ থেকে আপনার যে উপাদানগুলি চান তা পেতে হবে। তারপরে ডেটকম্পোন্টের কাছ থেকে তারিখটি পান এবং তাদের তুলনা করুন।
জর্জিও ডোগানিরো

52

Dateহয় Comparableএবং Equatable(সুইফট 3 হিসাবে)

এই উত্তরটি @ অঙ্কিত ঠাকুরের উত্তরকে পরিপূরক করে।

যেহেতু সুইফ্ট 3 Dateস্ট্রাক্ট (অন্তর্নিহিত NSDateশ্রেণির উপর ভিত্তি করে ) Comparableএবং Equatableপ্রোটোকলগুলি গ্রহণ করে ।

  • Comparableযে প্রয়োজন Dateঅপারেটার বাস্তবায়ন: <, <=, >, >=
  • Equatableঅপারেটর Dateবাস্তবায়ন প্রয়োজন ==
  • Equatableঅপারেটরের Dateডিফল্ট বাস্তবায়ন !=(যা Equatable ==অপারেটরের প্রয়োগের বিপরীত ) ব্যবহার করতে দেয় ।

নিম্নলিখিত নমুনা কোডগুলি এই তুলনা অপারেটরদের ব্যায়াম করে এবং নিশ্চিত করে যে কোন তুলনা printবিবৃতিতে সত্য ।

তুলনা ফাংশন

import Foundation

func describeComparison(date1: Date, date2: Date) -> String {

    var descriptionArray: [String] = []

    if date1 < date2 {
        descriptionArray.append("date1 < date2")
    }

    if date1 <= date2 {
        descriptionArray.append("date1 <= date2")
    }

    if date1 > date2 {
        descriptionArray.append("date1 > date2")
    }

    if date1 >= date2 {
        descriptionArray.append("date1 >= date2")
    }

    if date1 == date2 {
        descriptionArray.append("date1 == date2")
    }

    if date1 != date2 {
        descriptionArray.append("date1 != date2")
    }

    return descriptionArray.joined(separator: ",  ")
}

নমুনা ব্যবহার

let now = Date()

describeComparison(date1: now, date2: now.addingTimeInterval(1))
// date1 < date2,  date1 <= date2,  date1 != date2

describeComparison(date1: now, date2: now.addingTimeInterval(-1))
// date1 > date2,  date1 >= date2,  date1 != date2

describeComparison(date1: now, date2: now)
// date1 <= date2,  date1 >= date2,  date1 == date2

31

সুইফট 3 এবং উপরে থেকে তারিখটি তুলনামূলক তাই আমরা সরাসরি তারিখগুলির সাথে তুলনা করতে পারি

let date1 = Date()
let date2 = Date().addingTimeInterval(50)

let isGreater = date1 > date2
print(isGreater)

let isSmaller = date1 < date2
print(isSmaller)

let isEqual = date1 == date2
print(isEqual)

বিকল্পভাবে আমরা তারিখে এক্সটেনশন তৈরি করতে পারি

extension Date {

  func isEqualTo(_ date: Date) -> Bool {
    return self == date
  }
  
  func isGreaterThan(_ date: Date) -> Bool {
     return self > date
  }
  
  func isSmallerThan(_ date: Date) -> Bool {
     return self < date
  }
}

ব্যবহার: let isEqual = date1.isEqualTo(date2)


যদি আমি সময়কে উপেক্ষা করতে চাই যেমন 2019-05-14 12:08:14 +0000== 2019-05-14সত্য হওয়া উচিত return তারপর কি ?
ওবাইস ফায়াজ

16

এই http://iswift.org/cookbook/compare-2-dates দেখুন

তারিখগুলি পান:

// Get current date
let dateA = NSDate()

// Get a later date (after a couple of milliseconds)
let dateB = NSDate()

সুইচ স্টেটমেন্ট ব্যবহার করা হচ্ছে

// Compare them
switch dateA.compare(dateB) {
    case .OrderedAscending     :   print("Date A is earlier than date B")
    case .OrderedDescending    :   print("Date A is later than date B")
    case .OrderedSame          :   print("The two dates are the same")
}

আইএফ বিবৃতি ব্যবহার

 if dateA.compare(dateB) == .orderedAscending {
     datePickerTo.date = datePicker.date
 }

 //OR

 if case .orderedAcending = dateA.compare(dateB) {

 }

9

আমার জন্য সমস্যাটি ছিল ডেট ক্লাসে আমার নিজস্ব এক্সটেনশন ছিল যা সমস্ত তুলনামূলক অপারেটরকে সংজ্ঞায়িত করে। এখন (দ্রুত 3) যে তারিখটি তুলনামূলক, এই এক্সটেনশনগুলির প্রয়োজন নেই needed তাই আমি তাদের মন্তব্য করেছিলাম এবং এটি কার্যকর হয়েছিল।


8

সুইফট 3: আপনি যা সন্ধান করছেন এটি এটি কিনা তা জানেন না। তবে আমার স্ট্রিংটি এখন আগের চেয়ে পুরনো কিনা তা দেখতে আমি একটি স্ট্রিংকে বর্তমান টাইমস্ট্যাম্পের সাথে তুলনা করি।

func checkTimeStamp(date: String!) -> Bool {
        let dateFormatter: DateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        dateFormatter.locale = Locale(identifier:"en_US_POSIX")
        let datecomponents = dateFormatter.date(from: date)

        let now = Date()

        if (datecomponents! >= now) {
            return true
        } else {
            return false
        }
    }

এটি ব্যবহার করতে:

if (checkTimeStamp(date:"2016-11-21 12:00:00") == false) {
    // Do something
}

6

আপনি উদাহরণস্বরূপ সেকেন্ড উপেক্ষা করতে চাইলে আপনি ব্যবহার করতে পারেন

Func isDate (তারিখ, সমমানের তারিখ: তারিখ, টু ইউনাইটগ্র্যানুলারিটি: এনএসক্যালেন্ডার.উনিত) -> বুল

উদাহরণটি যদি একই দিন হয় তুলনা করুন:

Calendar.current.isDate(date1, equalTo: date2, toGranularity: .day)

5

তারিখটি কেবল বছরের সাথে - মাস - দিন এবং সময় ছাড়া আমার সাথে এইভাবে কাজ করে:

     let order = Calendar.current.compare(self.startDate, to: compareDate!, toGranularity: .day)  

                      switch order {
                        case .orderedAscending:
                            print("\(gpsDate) is after \(self.startDate)")
                        case .orderedDescending:
                            print("\(gpsDate) is before \(self.startDate)")
                        default:
                            print("\(gpsDate) is the same as \(self.startDate)")
                        }

1

এই লেখার সময় পর্যন্ত সুইফট নেটিভ সমর্থন সব তুলনা অপারেটরদের সঙ্গে তারিখ তুলনা (অর্থাত <, <=, ==, >=, এবং >)। এছাড়াও আপনি ঐচ্ছিক তারিখ তুলনা করতে পারবেন কিন্তু সীমাবদ্ধ <, ==এবং >। আপনার যদি প্রয়োজন হয় <=বা দুটি ব্যবহার করে alচ্ছিক তারিখগুলি তুলনা করতে বা >=, যেমন

let date1: Date? = ...
let date2: Date? = ...
if date1 >= date2 { ... }

বিকল্পগুলি সমর্থন করতে আপনি <=>=অপারেটরগুলি ওভারলোড করতে পারেন :

func <= <T: Comparable>(lhs: T?, rhs: T?) -> Bool {
    return lhs == rhs || lhs < rhs
}

func >= <T: Comparable>(lhs: T?, rhs: T?) -> Bool {
    return lhs == rhs || lhs > rhs
}

1
extension Date {
 func isBetween(_ date1: Date, and date2: Date) -> Bool {
    return (min(date1, date2) ... max(date1, date2)).contains(self)
  }
}

let resultArray = dateArray.filter { $0.dateObj!.isBetween(startDate, and: endDate) }

1

এটি করার আরেকটি উপায়:

    switch date1.compare(date2) {
        case .orderedAscending:
            break

        case .orderedDescending:
            break;

        case .orderedSame:
            break
    }

1
   var strDateValidate = ""
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd"

            let firstDate = dateFormatter.date(from:lblStartTime.text!)
            let secondDate = dateFormatter.date(from:lblEndTime.text!)

            if firstDate?.compare(secondDate!) == .orderedSame || firstDate?.compare(secondDate!) == .orderedAscending {
                print("Both dates are same or first is less than scecond")
                strDateValidate = "yes"
            }
            else
            {
                //second date is bigger than first
                strDateValidate = "no"
            }

            if strDateValidate == "no"
            {
                alertView(message: "Start date and end date for a booking must be equal or Start date must be smaller than the end date", controller: self)
            }

1

সুইফট 5:

1) আপনি যদি তারিখের প্রকারটি ব্যবহার করেন:

let firstDate  = Date()
let secondDate = Date()

print(firstDate > secondDate)  
print(firstDate < secondDate)
print(firstDate == secondDate)

2) আপনি স্ট্রিং টাইপ ব্যবহার করুন:

let firstStringDate  = "2019-05-22T09:56:00.1111111"
let secondStringDate = "2019-05-22T09:56:00.2222222"

print(firstStringDate > secondStringDate)  // false
print(firstStringDate < secondStringDate)  // true
print(firstStringDate == secondStringDate) // false 

আমি নিশ্চিত নই বা দ্বিতীয় বিকল্পটি 100% এ কাজ করে। তবে আমি প্রথম স্ট্রিংডেট এবং দ্বিতীয় স্ট্রিংডেটের মানগুলি কতটা পরিবর্তন করব না ফলাফলটি সঠিক ছিল।


1

সুইফটে 3,4 এ আপনার "তুলনা" ব্যবহার করা উচিত। উদাহরণ স্বরূপ:

DateArray.sort { (($0)?.compare($1))! == .orderedDescending }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.