কীভাবে দুটি এনএসডিটসের তুলনা করবেন: কোনটি সাম্প্রতিকতম?


244

আমি একটি ড্রপবক্স সিঙ্ক অর্জন করার চেষ্টা করছি এবং দুটি ফাইলের তারিখের তুলনা করা দরকার। একটি আমার ড্রপবক্স অ্যাকাউন্টে এবং একটি আমার আইফোনে।

আমি নিম্নলিখিতটি নিয়ে এসেছি, তবে আমি অপ্রত্যাশিত ফলাফল পেয়েছি। আমি মনে করি দুটি তারিখের তুলনা করার সময় আমি মৌলিকভাবে কিছু ভুল করছি। আমি কেবল> <অপারেটরগুলি ব্যবহার করেছি তবে আমি অনুমান করি যে এটি দুটি ভাল এনএসডিট স্ট্রিংয়ের সাথে তুলনা করছি বলে ভাল না। এখানে আমরা যাচ্ছি:

NSLog(@"dB...lastModified: %@", dbObject.lastModifiedDate); 
NSLog(@"iP...lastModified: %@", [self getDateOfLocalFile:@"NoteBook.txt"]);

if ([dbObject lastModifiedDate] < [self getDateOfLocalFile:@"NoteBook.txt"]) {
    NSLog(@"...db is more up-to-date. Download in progress...");
    [self DBdownload:@"NoteBook.txt"];
    NSLog(@"Download complete.");
} else {
    NSLog(@"...iP is more up-to-date. Upload in progress...");
    [self DBupload:@"NoteBook.txt"];
    NSLog(@"Upload complete.");
}

এটি আমাকে নিম্নলিখিত (এলোমেলো এবং ভুল) আউটপুট দিয়েছে:

2011-05-11 14:20:54.413 NotePage[6918:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:54.414 NotePage[6918:207] iP...lastModified: 2011-05-11 13:20:48 +0000
2011-05-11 14:20:54.415 NotePage[6918:207] ...db is more up-to-date.

বা এটি যা সঠিক বলে মনে হচ্ছে:

2011-05-11 14:20:25.097 NotePage[6903:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:25.098 NotePage[6903:207] iP...lastModified: 2011-05-11 13:19:45 +0000
2011-05-11 14:20:25.099 NotePage[6903:207] ...iP is more up-to-date.

11

1
@ জোশকাসওয়েল যদি এটি আসল সদৃশ হয় তবে এগুলি কেন মার্জ করবেন না? আপনি এটি এর আগে করে ফেলেছেন ...
ড্যান রোজনস্টার্ক

1
কেবলমাত্র হীরা মডারেটররা @ ইয়ারকে একীভূত করতে পারে।
jscs

উত্তর:


658

আসুন দুটি তারিখ অনুমান করি:

NSDate *date1;
NSDate *date2;

তারপরে নীচের তুলনাটি বলবে কোনটি আগের / পরে / একই:

if ([date1 compare:date2] == NSOrderedDescending) {
    NSLog(@"date1 is later than date2");
} else if ([date1 compare:date2] == NSOrderedAscending) {
    NSLog(@"date1 is earlier than date2");
} else {
    NSLog(@"dates are the same");
}

আরও তথ্যের জন্য দয়া করে NSDate শ্রেণীর ডকুমেন্টেশন দেখুন।


বাহ! [তারিখ 1 পূর্ববর্তী তারিখ: তারিখ 2] ইত্যাদি নিয়ে বিড়বিড় করে মারবে बीट्स ... ধন্যবাদ - কোনও কারণে আমি তুলনাটি আগে ব্যবহার করার কথা ভাবিনি।
সোমমান

11
আমি এনএসআরআরডআরসেডিং <0 এবং এনএসআরডার্ডডেসেন্ডিং> 0 এর উপর নির্ভর করতে চাই That এটি তুলনাটি পড়তে সহজ করে তোলে: [তারিখ 1 তুলনা: তারিখ 2] <0 / * তারিখ 1 <তারিখ 2 * / এবং (সহজেই তৈরি করা) ভুল এড়াতে পারে @ এলবার্টমেগ চিহ্নিত করা. ;-)
jpap

ভাল - তুলনা পদ্ধতিটি ততোধিক ভুল হিসাবে ত্রুটি-প্রবণ। সুতরাং, আপনার (এনএসডিট *) পরবর্তী তারিখ ব্যবহার করা উচিত: (এনএসডিট *) অন্য একটি তারিখ যা উভয়ের পরবর্তী তারিখটি ফিরিয়ে দেবে। সুতরাং আপনি কেবল আপনার প্রত্যাশিত ফলাফলের তুলনা করুন এবং আপনি সম্পন্ন করেছেন! "ওয়াইত অবতরণ / আরোহী?" এর সাথে কোথাও কোথাও কোন ঝাঁকুনি নেই?!
মাসি

@jpap যে আমাকেও গণ্ডগোল করেছে; দেখে মনে হচ্ছে যে অ্যাপল আপনাকে ফলাফলটি date1 -> date2আরোহণ / উতরাইয়ের মতো ভাবতে চায় (এবং সুতরাং তারিখ 1 যথাক্রমে পরে বা পূর্ববর্তী)
জ্যাক

@ জ্যাকটি উপাদানগুলিকে সাজানোর জন্য অ্যালগরিদমগুলি বাছাই করার জন্য যাদু সংখ্যাগুলি (-1,0,1) ছাড়াই আরও বিমূর্ত উপায়। আপনি আরও বেশি পঠনযোগ্য নামের সাথে এই ধ্রুবকগুলিকে নিজেকে নতুন করে সংজ্ঞায়িত করতে পারেন। আমার উত্তরটি কাজটি করছে তবে পঠনযোগ্য কোডের পুরষ্কার নয়। নীচে স্ক্রোল করুন, অন্য ভাল আছে।
নিক

50

পার্টিতে দেরীতে, তবে এনএসডিট অবজেক্টের তুলনা করার আরেকটি সহজ উপায় হ'ল এগুলিকে আদিম ধর্মে রূপান্তর করা যা '>' '<' '==' ইত্যাদির সহজ ব্যবহারের অনুমতি দেয় etc

যেমন।

if ([dateA timeIntervalSinceReferenceDate] > [dateB timeIntervalSinceReferenceDate]) {
    //do stuff
}

timeIntervalSinceReferenceDateরেফারেন্স তারিখ (1 জানুয়ারী 2001, GMT) সাল থেকে তারিখটিকে সেকেন্ডে রূপান্তর করে। timeIntervalSinceReferenceDateএকটি এনএসটাইমআইন্টারওয়াল হিসাবে (যা একটি ডাবল টাইপডেফ), আমরা আদিম তুলকগুলি ব্যবহার করতে পারি।


4
(NSComparisonResult)compare:(NSDate *)এই সাধারণ অপারেশনের চেয়ে কিছুটা স্বজ্ঞাত তবে এখনও বেশ
ভার্জোজ

1
এছাড়াও করতে পারেন[dateA timeIntervalSinceDate:dateB] > 0
স্কট ফিস্টার

14

সুইফটে, আপনি বিদ্যমান অপারেটরগুলি ওভারলোড করতে পারেন:

func > (lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSinceReferenceDate > rhs.timeIntervalSinceReferenceDate
}

func < (lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSinceReferenceDate < rhs.timeIntervalSinceReferenceDate
}

তারপর, আপনার সাথে সরাসরি NSDates তুলনা করতে পারবেন <, >এবং ==(ইতিমধ্যে সমর্থিত)।


যদি আমি এটি থেকে কোনও এক্সটেনশান করার চেষ্টা করি, আমি "অপারেটরদের কেবলমাত্র বিশ্বব্যাপী সুযোগে অনুমোদিত", পরামর্শ পেয়েছি?
জনভানডিজ্ক

@ জনভানডিজক আপনি এটি কোনও এক্সটেনশনের ভিতরে রাখতে পারবেন না। আমি এটিকে এক্সটেনশানের মতো একই ফাইলে রেখে দিতাম, তবে বাইরের{ ... }
অ্যান্ড্রু

13

NSDate একটি তুলনা ফাংশন আছে।

compare:একটি NSComparisonResultমান প্রদান করে যা প্রাপকের অস্থায়ী ক্রম এবং অন্য একটি প্রদত্ত তারিখ নির্দেশ করে।

(NSComparisonResult)compare:(NSDate *)anotherDate

প্যারামিটারস : anotherDate রিসিভারের সাথে তুলনা করার তারিখ। এই মানটি শূন্য করা উচিত নয়। মানটি যদি শূন্য থাকে তবে আচরণটি অপরিবর্তিত রয়েছে এবং ম্যাক ওএস এক্সের ভবিষ্যতের সংস্করণগুলিতে পরিবর্তিত হতে পারে

ফেরত মূল্য:

  • যদি রিসিভার এবং অন্য তারিখ একে অপরের সমান হয়, NSOrderedSame
  • যদি রিসিভারটি পরে অন্য সময়সীমার তুলনায় হয়, NSOrderedDescending
  • যদি রিসিভার অন্য সময়সীমার তুলনায় সময়ের আগে হয় NSOrderedAscending,।

@ আইরিনের দুটি এনএসডিট অবজেক্টের সাথে তুলনা করার উপায় আছে যেখানে কেবল সময়ের উপাদানটি আলাদা? কিছু কারণে উপরের পদ্ধতিটি কাজ করে না।
uSeFuL

12

আপনি এনএসডিট তুলনাটি ব্যবহার করতে চান :, পরের তারিখ :, পূর্ববর্তী তারিখ :, বা ইসুয়ালটোডেট: পদ্ধতিগুলি। এই পরিস্থিতিতে <এবং> অপারেটরগুলি ব্যবহার করে পয়েন্টারগুলির সাথে তুলনা করা হয়, তারিখগুলি নয়


11
- (NSDate *)earlierDate:(NSDate *)anotherDate

এটি রিসিভার এবং অন্য তারিখের পূর্ববর্তীটি প্রদান করে। যদি উভয় এক হয় তবে রিসিভারটি ফিরে আসবে।


1
নোট করুন যে এনএসডিটসের ব্যাকিং অবজেক্ট আপনার সংকলিত কোডের 64৪-বিট সংস্করণে অনুকূলিত হতে পারে যেমন একই তারিখের একই তারিখের একই তারিখ থাকবে। তাই যদি cDate = [aDate earlierDate:bDate]তারপর cDate == aDateএবং cDate == bDateউভয় সত্য হতে পারে। এটি আইওএস 8
বেন ফ্লিন

1
বিপরীতে, 32 বিট প্ল্যাটফর্মে, যদি তারিখগুলি একই না হয়, -earlierDate:(এবং -laterDate:) রিসিভার বা তর্কটিকে না ফিরিয়ে দিতে পারে।
বেন লিংস

7

ইংরাজিতে তুলনা সহ কয়েকটি তারিখের ইউটিলিটিগুলি যা দুর্দান্ত:

#import <Foundation/Foundation.h>


@interface NSDate (Util)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
- (NSDate*) dateByAddingDays:(int)days;

@end

রুপায়ণ:

#import "NSDate+Util.h"


@implementation NSDate (Util)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedAscending);
}

-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedDescending);
}
-(BOOL) isLaterThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedDescending);

}
-(BOOL) isEarlierThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedAscending);
}

- (NSDate *) dateByAddingDays:(int)days {
    NSDate *retVal;
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setDay:days];

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    retVal = [gregorian dateByAddingComponents:components toDate:self options:0];
    return retVal;
}

@end

1
বা কেবল ব্যবহার করুন: github.com/erica/NS ​​তারিখ- এক্সটেনশানস
ড্যান রোজনস্টার্ক


6

আপনার ব্যবহার করা উচিত:

- (NSComparisonResult)compare:(NSDate *)anotherDate

তারিখ তুলনা করতে। উদ্দেশ্য সি তে কোনও অপারেটর ওভারলোডিং নেই


6

আপনি ছেলেরা কেন এই NSDateতুলনামূলক পদ্ধতিগুলি ব্যবহার করবেন না :

- (NSDate *)earlierDate:(NSDate *)anotherDate;
- (NSDate *)laterDate:(NSDate *)anotherDate;

4

আমার প্রায় একই পরিস্থিতির মুখোমুখি হয়েছে, তবে আমার ক্ষেত্রে আমি কয়েক দিনের পার্থক্য পরীক্ষা করছি

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *compDate = [cal components:NSDayCalendarUnit fromDate:fDate toDate:tDate options:0];
int numbersOfDaysDiff = [compDate day]+1; // do what ever comparison logic with this int.

যখন আপনাকে দিন / মাস / বছর ইউনিটে এনএসডিট তুলনা করতে হবে তখন দরকারী


NSDayCalendarUnit তাই পরিবর্তে NSCalendarUnitDay ব্যবহার অবচিত
Mazen Kasser

2

আপনি এই পদ্ধতি দ্বারা দুটি তারিখ তুলনা করতে পারেন

        switch ([currenttimestr  compare:endtimestr])
        {
            case NSOrderedAscending:

                // dateOne is earlier in time than dateTwo
                break;

            case NSOrderedSame:

                // The dates are the same
                break;
            case NSOrderedDescending:

                // dateOne is later in time than dateTwo


                break;

        }

0

আমি এটি চেষ্টা করেছি আশা করি এটি আপনার পক্ষে কাজ করে

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];      
int unitFlags =NSDayCalendarUnit;      
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];     
NSDate *myDate; //= [[NSDate alloc] init];     
[dateFormatter setDateFormat:@"dd-MM-yyyy"];   
myDate = [dateFormatter dateFromString:self.strPrevioisDate];     
NSDateComponents *comps = [gregorian components:unitFlags fromDate:myDate toDate:[NSDate date] options:0];   
NSInteger day=[comps day];

0

তারিখ তুলনার জন্য এই সাধারণ ফাংশনটি ব্যবহার করুন

-(BOOL)dateComparision:(NSDate*)date1 andDate2:(NSDate*)date2{

BOOL isTokonValid;

if ([date1 compare:date2] == NSOrderedDescending) {
    NSLog(@"date1 is later than date2");
    isTokonValid = YES;
} else if ([date1 compare:date2] == NSOrderedAscending) {
    NSLog(@"date1 is earlier than date2");
    isTokonValid = NO;
} else {
    isTokonValid = NO;
    NSLog(@"dates are the same");
}

return isTokonValid;}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.