অন্য দুটি এনএসডিটের মধ্যে এনএসডিট ঘটে কিনা তা কীভাবে পরীক্ষা করবেন to


91

আমি এনএসডিট ব্যবহার করে বর্তমান তারিখ একটি তারিখের সীমার মধ্যে পড়ে কি না তা জানার চেষ্টা করছি।

উদাহরণস্বরূপ, আপনি এনএসডিট ব্যবহার করে বর্তমান তারিখ / সময় পেতে পারেন:

NSDate rightNow = [NSDate date];

তারপরে আমি সেই তারিখটি 9am - 5PM এর মধ্যে রয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করতে চাই ।


4
আপনি কীভাবে একটি নির্দিষ্ট সময়সীমার জন্য এনএসডিট অবজেক্ট তৈরি করতে পারেন সে সম্পর্কিত আরও তথ্যের জন্য এই প্রশ্নের উত্তরের দিকে একবার নজর দিতে পারেন , যেমন সন্ধ্যা-টা থেকে রাত ৯ টা পর্যন্ত।
মার্ক চর্বোনিউ

উত্তর:


168

আমি একটি সমাধান নিয়ে এসেছি। আপনার যদি আরও ভাল সমাধান হয় তবে নির্দ্বিধায় এটি ছেড়ে দিন এবং আমি এটিকে সঠিক হিসাবে চিহ্নিত করব।

+ (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate
{
    if ([date compare:beginDate] == NSOrderedAscending)
        return NO;

    if ([date compare:endDate] == NSOrderedDescending) 
        return NO;

    return YES;
}

4
এটি দেখতে দুর্দান্ত দেখাচ্ছে, তবে আপনি এটির মতো নতুন নামটি পরিবর্তন করতে পারেন: + (BOOL) তারিখ: (এনএসডিট *) তারিখটি বিটুইনডেট: (এনএসডিট *) আরম্ভের তারিখ এবং তারিখ: (এনএসডিট *) বিভ্রান্তি এড়াতে শেষ তারিখ।
জেফ কেলি

4
কোড গল্ফ! সংকলকটির তুলনাটি শর্ট সার্কিট করা উচিত, দক্ষতাটি আপনার কাছে যা আছে তার প্রায় সমান করে: রিটার্ন (([তারিখের তুলনা: আরম্ভ তারিখ]! ​​= এনএসআরডডেসেন্ডিং)) && ([তারিখের তুলনা: শেষ তারিখ]! ​​= এনএসআরআরডসেন্ডিং));
টিম

4
আরও ভাল, আমি এটি একটি উদাহরণ পদ্ধতি (এনএসডিট সংযোজন) করব, কোনও ক্লাস পদ্ধতি নয়। আমি এই সাথে যাব: -সর্বস্বরে তারিখ: এবং তারিখ:
ডেভ বাটন

4
দুর্দান্ত! আমি এটি থেকে একটি বিভাগ তৈরি করেছি:- (BOOL)isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate;
মাত্তেও আলেসানী

4
দুর্দান্ত সমাধান, আপনি এটি শর্ট সার্কিট (এবং একটি মৌলিক ডি মরগান অ্যাপ্লিকেশন দ্বারাও কম ভার্বোস তৈরি করতে পারেনreturn !([date compare:startDate] == NSOrderedAscending || [date compare:endDate] == NSOrderedDescending);
গ্যাব্রিয়েল পেট্রোনেলা

13

প্রথম অংশ জন্য, থেকে উত্তর ব্যবহার @kperryua NSDate বস্তু আপনার সাথে তুলনা করতে চান গঠন করা। আপনার নিজের প্রশ্নের নিজের উত্তর থেকে মনে হচ্ছে আপনি এটি বের করেছেন।

তারিখগুলি তুলনা করার জন্য, আমি আপনার উত্তর সম্পর্কে @ টিমের মন্তব্যের সাথে সম্পূর্ণ সম্মত । এটি আরও সংক্ষিপ্ত এখনও আপনার কোডের ঠিক সমান এবং আমি কেন তা ব্যাখ্যা করব।

+ (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
    return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}

যদিও এটি দেখে মনে হতে পারে যে রিটার্নের বিবৃতি অবশ্যই অ্যান্ড অপারেটরের উভয় ক্রিয়াকলাপকে মূল্যায়ন করবে, এটি আসলে এটি নয়। মূলটি হ'ল " শর্ট-সার্কিট মূল্যায়ন ", যা বিভিন্ন ধরণের প্রোগ্রামিং ভাষায় প্রয়োগ করা হয়, এবং অবশ্যই সি তে। মূলত অপারেটর &এবং &&"শর্ট সার্কিট" যদি প্রথম যুক্তিটি 0 হয় (বা না, নীল, ইত্যাদি) , যখন |এবং ||প্রথম আর্গুমেন্ট 0 না হলে একই কাজ করুন যদি dateআগে আসে beginDate, পরীক্ষার NOসাথে তুলনা করার প্রয়োজন ছাড়াই ফিরে আসে endDate। মূলত, এটি আপনার কোডের মতো একই কাজ করে তবে এক লাইনে একক বিবৃতিতে 5 নয় (বা 7, সাদা স্থান সহ)।

এটি গঠনমূলক ইনপুট হিসাবে লক্ষ্যযুক্ত, যেহেতু প্রোগ্রামাররা যখন তাদের বিশেষ প্রোগ্রামিং ভাষাটি লজিক্যাল এক্সপ্রেশনকে মূল্যায়ন করে তা বোঝে, তারা দক্ষতার বিষয়ে এত কিছু না করে এগুলি আরও কার্যকরভাবে তৈরি করতে পারেন। যাইহোক, অনুরূপ পরীক্ষাগুলি কম দক্ষ হবে কারণ সমস্ত অপারেটর শর্ট সার্কিট নয়। (প্রকৃতপক্ষে, সংখ্যার তুলনা অপারেটরগুলির মতো শর্ট সার্কিটই বেশিরভাগ ক্ষেত্রেই করা যায় না )) সন্দেহ হলে, আপনার যুক্তি ছিন্ন করার ক্ষেত্রে এটি সর্বদা স্পষ্ট হওয়া নিরাপদ but তবে আপনি যখন ভাষা / সংকলককে ছোট জিনিসগুলি পরিচালনা করতে দেবেন তখন কোডটি আরও বেশি পঠনযোগ্য হতে পারে তোমার জন্য.


4
বোধগম্য। আমার ধারণা ছিল না যে ওজেক্টিভ-সি শর্ট সার্কিট মূল্যায়ন করবে। আমি এটিতে আপনার কথাটি নিয়ে যাব। আমার জন্য এটি সাফ করার জন্য ধন্যবাদ। আমি মনে করি আমি আপনাকে সঠিক হিসাবে চিহ্নিত করব যেহেতু আপনার উত্তরটি আমার নিজের চেয়ে বেশি সংক্ষিপ্ত ... এবং আমি কিছু শিখেছি :)
ব্রুক উলফ

এর জন্য আমার কথাটি নেওয়ার দরকার নেই - আমি কেবলমাত্র আমার কৌতূহলকে সন্তুষ্ট করতে এবং যখন কিছু কাজ করে এবং কখন না ঘটে তার সীমাবদ্ধতা শিখতে হলে "বিশ্বাস, তবে যাচাই করুন" (ধন্যবাদ, রোনাল্ড রেগান!) নীতিটিটি সমর্থন করি। আপনি দুটি পদ্ধতির একটি&& করে যাচাই করতে পারেন যা তাদের ডাকে যখন ফিরে আসে তখন লগইন করে; আপনি লক্ষ্য করবেন যে প্রথমটি যদি 0 ফেরত দেয় তবে দ্বিতীয়টি কখনও কল করা হবে না।
কুইন টেলর 14

7

সুইফটে ব্রোক উলফ সংস্করণ:

extension NSDate
{
    func isBetweenDates(beginDate: NSDate, endDate: NSDate) -> Bool
    {
        if self.compare(beginDate) == .OrderedAscending
        {
            return false
        }

        if self.compare(endDate) == .OrderedDescending
        {
            return false
        }

        return true
    }
}

4

আপনি যদি জানতে চান যে বর্তমান তারিখটি সময়মতো দুটি প্রদত্ত পয়েন্টের মধ্যে পড়ে (9am - 5PM 7/১০/২০১৮ তারিখে), এনএসসিলেটর এবং এনএসডিটকম্পোন্টসগুলি ব্যবহার করে কাঙ্ক্ষিত সময়ের জন্য এনএসডিট তৈরি করুন এবং সেগুলি বর্তমান তারিখের সাথে তুলনা করুন।

যদি আপনি জানতে চান যে বর্তমান তারিখটি প্রতিদিন এই দুই ঘন্টার মধ্যে পড়ে তবে আপনি সম্ভবত অন্যভাবে যেতে পারেন। একটি এনএসডিটকম্পোন্টস অবজেক্ট তৈরি করুন এবং এনএসসিএলগ্র্যান্ড এবং আপনার এনএসডিট এবং ঘন্টা উপাদানগুলির সাথে তুলনা করুন।


4

আপনি যদি আইওএস 10.0 + / ম্যাকোস 10.12+ লক্ষ্য করতে পারেন তবে DateIntervalক্লাসটি ব্যবহার করুন ।

প্রথমে একটি শুরু এবং শেষের তারিখ সহ একটি তারিখ ব্যবধান তৈরি করুন:

let start: Date = Date()
let middle: Date = Date()
let end: Date = Date()

let dateInterval: DateInterval = DateInterval(start: start, end: end)

তারপরে, containsপদ্ধতিটি ব্যবহার করে তারিখটি ব্যবধানে রয়েছে কিনা তা পরীক্ষা করুন DateInterval:

let dateIsInInterval: Bool = dateInterval.contains(middle) // true

3

তারিখের সময় ব্যবধানগুলি ব্যবহার করে এটি সহজেই সম্পন্ন করা যায়:

const NSTimeInterval i = [date timeIntervalSinceReferenceDate];
return ([startDate timeIntervalSinceReferenceDate] <= i &&
        [endDate timeIntervalSinceReferenceDate] >= i);

3

কুইনস এবং ব্রোকের সমাধানগুলি চালিয়ে যাওয়া, এনএসডিট বাস্তবায়ন সাবক্লাসটি করতে খুব সুন্দর, সুতরাং এটি সর্বত্র এর মতো ব্যবহার করা যেতে পারে:

-(BOOL) isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
    return (([self compare:beginDate] != NSOrderedAscending) && ([self compare:endDate] != NSOrderedDescending));
}

এবং আপনার কোডের যে কোনও অংশে আপনি এটি ব্যবহার করতে পারেন:

[myNSDate isBetweenDate:thisNSDate andDate:thatNSDate];

(মাইএনএসডেট, এই এনএসডিট এবং সেই এনএসডিট অবশ্যই এনএসডিটস :)


3

এই সমস্যার আরও ভাল এবং আরও দ্রুত সমাধান রয়েছে।

extention Date {
    func isBetween(from startDate: Date,to endDate: Date) -> Bool {
        let result = (min(startDate, endDate) ... max(startDate, endDate)).contains(self)
        return result
    }
}

তাহলে আপনি এটিকে এভাবে কল করতে পারেন।

todayDate.isBetween(from: startDate, to: endDate)

এমনকি আপনি এই তারিখটি এলোমেলোভাবে পাস করতে পারবেন কারণ এই এক্সটেনশনটি কোনটি ন্যূনতম এবং কোনটি নয় তা যাচাই করে।

আপনি এটি দ্রুত এবং ততোধিক উপরে ব্যবহার করতে পারেন।


2

সুইফট 5 এর সাহায্যে, আপনি অন্য দুটি তারিখের মধ্যে তারিখ হয় কিনা তা পরীক্ষা করতে নীচের দুটি সমাধানগুলির মধ্যে একটি ব্যবহার করতে পারেন।


# 1 DateIntervalএর contains(_:)পদ্ধতি ব্যবহার করে

DateIntervalএকটি পদ্ধতি বলা হয় contains(_:)contains(_:)নিম্নলিখিত ঘোষণা আছে:

func contains(_ date: Date) -> Bool

এই ব্যবধানে প্রদত্ত তারিখ রয়েছে কিনা তা সূচিত করে।

নিম্নলিখিত খেলার মাঠের কোডটি দেখায় যে কীভাবে contains(_:)দুটি অন্যান্য তারিখের মধ্যে তারিখ ঘটে কিনা তা পরীক্ষা করতে কীভাবে ব্যবহার করতে হয়:

import Foundation

let calendar = Calendar.current
let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!
let myDate = calendar.date(from: DateComponents(year: 2012, month: 8, day: 15))!

let dateInterval = DateInterval(start: startDate, end: endDate)
let result = dateInterval.contains(myDate)
print(result) // prints: true

# 2 ClosedRangeএর contains(_:)পদ্ধতি ব্যবহার করে

ClosedRangeএকটি পদ্ধতি বলা হয় contains(_:)contains(_:)নিম্নলিখিত ঘোষণা আছে:

func contains(_ element: Bound) -> Bool

প্রদত্ত উপাদানটি সীমার মধ্যে রয়েছে কিনা তা নির্দেশ করে একটি বুলিয়ান মান প্রদান করে।

নিম্নলিখিত খেলার মাঠের কোডটি দেখায় যে কীভাবে contains(_:)দুটি অন্যান্য তারিখের মধ্যে তারিখ ঘটে কিনা তা পরীক্ষা করতে কীভাবে ব্যবহার করতে হয়:

import Foundation

let calendar = Calendar.current
let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!
let myDate = calendar.date(from: DateComponents(year: 2012, month: 8, day: 15))!

let range = startDate ... endDate
let result = range.contains(myDate)
//let result = range ~= myDate // also works
print(result) // prints: true

-1

সুইফটে আরও ভাল সংস্করণ:

@objc public class DateRange: NSObject {
    let startDate: Date
    let endDate: Date

    init(startDate: Date, endDate: Date) {
        self.startDate = startDate
        self.endDate = endDate
    }

    @objc(containsDate:)
    func contains(_ date: Date) -> Bool {
        let startDateOrder = date.compare(startDate)
        let endDateOrder = date.compare(endDate)
        let validStartDate = startDateOrder == .orderedAscending || startDateOrder == .orderedSame
        let validEndDate = endDateOrder == .orderedDescending || endDateOrder == .orderedSame
        return validStartDate && validEndDate
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.