अगर एक NSDate आज है तो कैसे निर्धारित करें?


156

NSDateआज का है तो कैसे चेक करें ?

मैं पहले 10 अक्षरों का उपयोग करके इसे जांचता था [aDate description][[aDate description] substringToIndex:10]रिटर्न स्ट्रिंग की तरह "YYYY-MM-DD"इसलिए मैंने स्ट्रिंग के साथ स्ट्रिंग की तुलना की [[[NSDate date] description] substringToIndex:10]

क्या जांच करने के लिए अधिक तेज़ और / या साफ तरीका है?

धन्यवाद।


मेरा मानना ​​है कि मेरी विधि केवल एक है (मेरे लेखन के रूप में) जो वास्तव में Apple के दस्तावेज़ीकरण को संदर्भित करता है और वही करता है जो यह निर्धारित करने के लिए कि दो दिन समान हैं। यद्यपि अन्य विधियां काम कर सकती हैं, मेरा मानना ​​है कि मेरी विधि भविष्य का प्रमाण है। stackoverflow.com/a/17641925/901641
आर्टऑफवर्फ

@ArtOfWarfare: मैं असहमत हूं। आपके कोड को अभी भी समय अंतराल से निपटने की आवश्यकता है, लेकिन सेब ऐसे तरीके प्रदान करता है जो पहले से ही इसे दूर कर देते हैं - देखें: stackoverflow.com/a/17642033/106435
vikingosegundo

1
NSDate "विवरण" विधि UTC प्रारूप में दिनांक प्रदर्शित करती है, जो कि ग्रीनविच मीन टाइम है, जिसमें डेलाइट बचत समय के लिए कोई सुधार नहीं है। यदि आप यूएसए में शाम को देर से आते हैं, या भारत में सुबह जल्दी उठते हैं, तो यह आपके कैलेंडर के अनुसार "आज" नहीं है। NSDate को एक दिन में अनुवाद करने के लिए, और वर्तमान तिथि को एक दिन में परिवर्तित करने के लिए आपको NSCalendar ऑब्जेक्ट की आवश्यकता है, फिर उनकी तुलना करें।
gnasher729

जवाबों:


308

MacOS 10.9+ और iOS 8+ में, NSCalendar / कैलेंडर पर एक विधि है जो वास्तव में ऐसा करती है!

- (BOOL)isDateInToday:(NSDate *)date 

तो आप बस करेंगे

उद्देश्य सी:

BOOL today = [[NSCalendar currentCalendar] isDateInToday:date];

स्विफ्ट 3:

let today = Calendar.current.isDateInToday(date)

1
IOS31

1
मैं उपरोक्त टिप्पणी से भ्रमित हूं, यह निश्चित रूप से iOS 8 है: - (BOOL) isDateInToday: (NSDate *) तारीख NS_AVAILABLE (10_9, 8_0);
powerj1984

हां, मैंने यही कहा है। पिछले टिप्पणीकार iOS 7 SDK को देखकर भ्रम में था। इसकी एक अलग घोषणा थी।
कैटफ़िश_मैन

'आज' के लिए यह एकदम सही उत्तर है :)
डॅयाॅ-जॅान

बहुत बढ़िया जवाब!
सुपरटेककोनॉफ

192

आप दिनांक घटकों की तुलना कर सकते हैं:

NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aDate];
NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
if([today day] == [otherDay day] &&
   [today month] == [otherDay month] &&
   [today year] == [otherDay year] &&
   [today era] == [otherDay era]) {
    //do stuff
}

संपादित करें:

मुझे स्टीफन की विधि अधिक पसंद है, मुझे लगता है कि यह कथन के लिए एक क्लीनर और अधिक समझ में आता है:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components];
components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:aDate];
NSDate *otherDate = [cal dateFromComponents:components];

if([today isEqualToDate:otherDate]) {
    //do stuff
}

क्रिस, मैंने आपका सुझाव शामिल कर लिया है। मुझे यह देखना था कि क्या युग था, इसलिए किसी और के लिए जो नहीं जानता, यह बीसी और एडी के बीच अंतर करता है। यह शायद ज्यादातर लोगों के लिए अनावश्यक है, लेकिन यह जांचना आसान है और कुछ निश्चितता जोड़ता है, इसलिए मैंने इसे शामिल किया है। यदि आप गति के लिए जा रहे हैं, तो यह संभवतः एक अच्छी विधि नहीं है।


एसओ पर कई उत्तरों के साथ नोट करें , 7 वर्षों के बाद यह पूरी तरह से पुराना है। स्विफ्ट में अब बस उपयोग करें.isDateInToday


1
धन्यवाद। मुझे लगता है कि यह मेरे प्रश्न का अधिक स्वच्छ और भविष्य-सुरक्षित समाधान है।
सेन्गून

1
मुझे लगता है कि आपको युग घटक को भी शामिल करने की आवश्यकता है। मुझे लगता है कि यह दो दृष्टिकोणों के बीच एक सिक्का टॉस है; isEalalToDate अच्छा लग रहा है, लेकिन यह थोड़ा बेकार लगता है और घटकों से एक तारीख को फिर से संगठित करने के लिए समान संख्या में लाइनें लेता है।
क्रिस पेज

1
चूंकि "otherDay" और "Today" दोनों में वैसे भी केवल चार फ़ील्ड भरे गए हैं (यह आप सभी से अनुरोध किया गया है), आप दूसरे में हुप्स को कूदने के बिना [आज के बराबर: otherDay] का उपयोग कर सकते हैं।
ग्लेन मेनार्ड

@ क्या आप सुझाव दे रहे हैं कि मैं पहले एक में NSDateCompords की तुलना करूं? मैं वास्तव में उस बारे में नहीं सोचा था, लेकिन यह भी एक अच्छा विचार है।
डेविड कनारेक

1
@DavidKanarek पुरानी पोस्ट खोदना ... मैं सीधे तारीख घटकों की तुलना करने की सलाह नहीं दूंगा, यदि आप ऐसी स्थिति में आते हैं, जहां आपको किसी एक घटक को ऑफसेट करने की आवश्यकता होती है, तो आपको महीने == 3, दिन == 34 जैसा कुछ मिल सकता है। तारीखों में
बदलना

27

यह आपके प्रश्न का एक अपमान है, लेकिन यदि आप "टुडे" या "टुमॉरो" के साथ एक NSDate प्रिंट करना चाहते हैं, तो फ़ंक्शन का उपयोग करें

- (void)setDoesRelativeDateFormatting:(BOOL)b

NSDateFormatter के लिए


3
चतुर विचार। लेकिन मुझे लगता है कि यदि आप स्थानीयकरण करते हैं, तो "आज" स्ट्रिंग की तलाश करेंगे।
तुलसी बोर्क

16

मैं आज की तारीख को आधी रात और दूसरी तारीख को सामान्य करने की कोशिश करूंगा, आधी रात को सामान्य करूंगा फिर तुलना करूंगा कि क्या यह वही एनएसडी है।

से एक एप्पल उदाहरण आप निम्न तरीके से आधी रात आज की तारीख करने के लिए सामान्य, तो दूसरी तिथि और तुलना के लिए भी ऐसा ही है:

NSCalendar * gregorian = [[NSCalendar alloc]
                               initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents * components =
    [gregorian components:
                 (NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
                 fromDate:[NSDate date]];
NSDate * today = [gregorian dateFromComponents:components];

मुझे लगता है कि आपको युग को भी शामिल करने की आवश्यकता है।
क्रिस पेज

क्या 12, यानी मध्याह्न नहीं, मध्यरात्रि को समय निर्धारित करके तिथि को सामान्य नहीं किया जाना चाहिए? चूंकि तिथि जीएमटी में है, इसलिए इसे दोपहर तक सेट करने से यह सुनिश्चित होता है कि समय क्षेत्र दोनों तरीकों से भिन्न होता है (और वे 12h तक केवल दोनों तरीकों से चलते हैं) दिन या उससे पहले दिन में 'कूद' नहीं करते हैं।
आर्टूरस

13

कैटफ़िश_मन द्वारा सुझाव का कार्य विस्तार 3 और 4 विस्तार :

extension Date {

    func isToday() -> Bool {
        return Calendar.current.isDateInToday(self)
    }

}

12

घटकों, युगों और सामानों से जूझने की जरूरत नहीं है।

NSCalendar मौजूदा तिथि के लिए एक निश्चित समय इकाई की शुरुआत प्राप्त करने के लिए एक विधि प्रदान करता है।

इस कोड को आज और दूसरी तारीख की शुरुआत मिलेगी और इसकी तुलना करेंगे। यदि यह मूल्यांकन करता है NSOrderedSame, तो दोनों तिथियां एक ही दिन के दौरान हैं - इसलिए आज।

NSDate *today = nil;
NSDate *beginningOfOtherDate = nil;

NSDate *now = [NSDate date];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&today interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfOtherDate interval:NULL forDate:beginningOfOtherDate];

if([today compare:beginningOfOtherDate] == NSOrderedSame) {
    //otherDate is a date in the current day
}

9
extension NSDate {
  func isToday() -> Bool {
    let cal = NSCalendar.currentCalendar()
    var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
    let today = cal.dateFromComponents(components)!

    components = cal.components([.Era, .Year, .Month, .Day], fromDate:self)
    let otherDate = cal.dateFromComponents(components)!

    return today.isEqualToDate(otherDate)
}

स्विफ्ट 2.0 पर मेरे लिए काम किया


6

सबसे अच्छा जवाब के स्विफ्ट संस्करण:

let cal = NSCalendar.currentCalendar()
var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
let today = cal.dateFromComponents(components)!

components = cal.components([.Era, .Year, .Month, .Day], fromDate:aDate);
let otherDate = cal.dateFromComponents(components)!

if(today.isEqualToDate(otherDate)) {
    //do stuff
}

5

"प्रदर्शन कैलेंडर गणना" शीर्षक वाले Apple के दस्तावेज़ प्रविष्टि का संदर्भ लें [लिंक]

उस पृष्ठ पर 13 को सूचीबद्ध करने से पता चलता है कि दिनों के बीच मिडनाइट्स की संख्या निर्धारित करने के लिए, आप उपयोग करते हैं:

- (NSInteger)midnightsFromDate:(NSDate *)startDate toDate:(NSDate *)endDate
{
    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
    NSInteger startDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
                                             inUnit:NSEraCalendarUnit
                                            forDate:startDate];
    NSInteger endDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
                                           inUnit:NSEraCalendarUnit
                                          forDate:endDate];
    return endDay - startDay;
}

फिर आप यह निर्धारित कर सकते हैं कि दो दिन उस पद्धति का उपयोग करके समान हैं और यह देखते हुए कि यह 0 देता है या नहीं।


2
ध्यान रखें कि एक युग 00:00 GMT से शुरू होता है! यह विधि सही तरीके से काम नहीं कर सकती है यदि कोई दिनांक (या दोनों) GMT समयक्षेत्र में नहीं है।
एंड्रियास लेई

5

आप अपनी तिथि और वर्तमान तिथि के बीच के समय अंतराल की भी जांच कर सकते हैं:

[myDate timeIntervalSinceNow]

यह आपको समय अंतराल, सेकंड में, myDate और वर्तमान दिनांक / समय के बीच देगा।

लिंक करें

संपादित करें: हर किसी पर ध्यान दें: मैं अच्छी तरह से जानता हूं कि [myDate timeIntervalSinceNow] यह निर्धारित नहीं करता है कि क्या मायडेट आज है।

मैं इस उत्तर को इसलिए छोड़ रहा हूं ताकि यदि कोई ऐसा ही कुछ खोज रहा है और [myDate timeIntervalSinceNow] उपयोगी है, तो वे इसे यहां पा सकते हैं।


1
आप जो कहते हैं वह सही है, लेकिन अंतराल वास्तव में यह जांचने में मदद नहीं करता है कि क्या आज की तारीख है।
जानूस

3
बस ध्यान रखें कि यह वह है जो आपको बताता है कि आप अब से 24 घंटे के भीतर हैं, लेकिन अगर तारीखें समान नहीं हैं। एक दूसरा अंतर अलग-अलग तारीखों का हो सकता है और 86399 दूसरा अंतर एक ही तारीख का हो सकता है।
डेविड कनारे

@ डेविड: सच है। इस बारे में नहीं सोचा था क्योंकि मैं सवाल का जवाब देते समय 3 अन्य चीजें कर रहा था, और जब मैंने पेज लोड किया तो आपका जवाब पोस्ट नहीं किया गया था।
alesplin

1
यह प्रश्न का उत्तर नहीं देता है। आपको इसे हटा देना चाहिए।
वाइकिंगोज़गुंडो

1
यह जवाब कुछ और नहीं बल्कि शोर है। यह न तो प्रश्न का उत्तर देने का प्रयास करता है और न ही इसे संदर्भित करने के लिए आवश्यक है timeIntervalSinceNowक्योंकि यह कई अन्य पदों में शामिल है। इसके अलावा सेकंड के लिए जाँच के साथ दिन की तुलना को 86400 द्वारा त्रुटि-प्रवण विभाजन को प्रोत्साहित करें।
vikingosegundo

4

सबसे अच्छे उत्तरों के आधार पर स्विफ्ट एक्सटेंशन:

extension NSDate {
    func isToday() -> Bool {
        let cal = NSCalendar.currentCalendar()
        if cal.respondsToSelector("isDateInToday:") {
            return cal.isDateInToday(self)
        }
        var components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:NSDate())
        let today = cal.dateFromComponents(components)!

        components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:self);
        let otherDate = cal.dateFromComponents(components)!
        return today.isEqualToDate(otherDate)
    }
}

2

यदि आपके पास इन तारीखों की तुलना बहुत अधिक है, तो कॉल करने के लिए calendar:components:fromDate लिए बहुत समय शुरू हो जाता है। मेरे द्वारा की गई कुछ प्रोफाइलिंग के अनुसार, वे काफी महंगे लगते हैं।

यह कहें कि आप यह निर्धारित करने की कोशिश कर रहे हैं कि कुछ तिथियों में से, कहते NSArray *datesToCompareहैं, उसी दिन हैं जैसे किसी दिन, कहते हैं NSDate *baseDate, तो आप कुछ का उपयोग कर सकते हैं जैसे निम्नलिखित (आंशिक रूप से ऊपर दिए गए उत्तर से अनुकूलित):

NSDate *baseDate = [NSDate date];

NSArray *datesToCompare = [NSArray arrayWithObjects:[NSDate date], 
                           [NSDate dateWithTimeIntervalSinceNow:100],
                           [NSDate dateWithTimeIntervalSinceNow:1000],
                           [NSDate dateWithTimeIntervalSinceNow:-10000],
                           [NSDate dateWithTimeIntervalSinceNow:100000],
                           [NSDate dateWithTimeIntervalSinceNow:1000000],
                           [NSDate dateWithTimeIntervalSinceNow:50],
                           nil];

// determine the NSDate for midnight of the base date:
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) 
                                       fromDate:baseDate];
NSDate* theMidnightHour = [calendar dateFromComponents:comps];

// set up a localized date formatter so we can see the answers are right!
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];

// determine which dates in an array are on the same day as the base date:
for (NSDate *date in datesToCompare) {
    NSTimeInterval interval = [date timeIntervalSinceDate:theMidnightHour];
    if (interval >= 0 && interval < 60*60*24) {
        NSLog(@"%@ is on the same day as %@", [dateFormatter stringFromDate:date], [dateFormatter stringFromDate:baseDate]);
    }
    else {
        NSLog(@"%@ is NOT on the same day as %@", [dateFormatter stringFromDate:date], [dateFormatter stringFromDate:baseDate]);
    }
}

आउटपुट:

Nov 23, 2011 1:32:00 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:33:40 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:48:40 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 10:45:20 AM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 24, 2011 5:18:40 PM is NOT on the same day as Nov 23, 2011 1:32:00 PM
Dec 5, 2011 3:18:40 AM is NOT on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:32:50 PM is on the same day as Nov 23, 2011 1:32:00 PM

इसके लिए धन्यवाद। स्वीकृत तरीका हमारे ऐप के लिए सीपीयू गहन था, इसलिए हमें इसे अनुकूलित करने की आवश्यकता थी।
एसेटाइक

1
यह कोड दिन के समय की बचत के लिए विफल हो जाएगा। कुख्यात संख्या 86,400 के साथ कोड का उपयोग करने वाला हर व्यक्ति सिरदर्द का कारण बन सकता है।
vikingosegundo

2

उपरोक्त कई उत्तरों की तुलना में आसान तरीका है!

NSDate *date = ... // The date you wish to test
NSCalendar *calendar = [NSCalendar currentCalendar];

if([calendar isDateInToday:date]) {
    //do stuff
}

1
कैटफ़िश_मन के जवाब के रूप में भी!
थान फाम

0

यह शायद एक NSDate श्रेणी के रूप में फिर से काम किया जा सकता है, लेकिन मैं इस्तेमाल किया:

// Seconds per day (24h * 60m * 60s)
#define kSecondsPerDay 86400.0f

+ (BOOL) dateIsToday:(NSDate*)dateToCheck
{
    // Split today into components
    NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* comps = [gregorian components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit) 
                                        fromDate:[NSDate date]];

    // Set to this morning 00:00:00
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];
    NSDate* theMidnightHour = [gregorian dateFromComponents:comps];
    [gregorian release];

    // Get time difference (in seconds) between date and then
    NSTimeInterval diff = [dateToCheck timeIntervalSinceDate:theMidnightHour];
    return ( diff>=0.0f && diff<kSecondsPerDay );
}

(हालांकि, मूल प्रश्न के रूप में दो तारीख के तार की तुलना में लगभग 'क्लीनर' लगता है ..)


compsजब आप तुरंत उन्हें शून्य पर सेट कर रहे हों तो बनाते समय घंटे, मिनट और सेकंड क्यों शामिल करें? इसके अलावा, मुझे लगता है कि आपको युग को शामिल करने की आवश्यकता है।
क्रिस पेज

कृपया ध्यान दें कि जबकि यह लगभग हर मामले में काम करेगा, लीप सेकंड जैसी चीजें हैं। मुझे नहीं पता कि Apple का NSDate वर्ग उन्हें कैसे संभालता है, लेकिन कुछ संभावना है कि यह काम नहीं करेगा। यह आपके तरीके की आलोचना के बजाय "आपको पता है" अधिक है क्योंकि वे अत्यधिक दुर्लभ हैं (इतिहास में 24)।
डेविड कानारेक

उन तारीखों के बारे में जो 24 घंटे लंबी नहीं हैं, लेकिन डेलाइट सेविंग टाइम्स के कारण 23 या 25 हैं?
vikingosegundo

0

iOS7 और पूर्व के लिए:

//this is now => need that for the current date
NSDate * now = [NSDate date];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setTimeZone:[NSTimeZone systemTimeZone]];

NSDateComponents * components = [calendar components:( NSYearCalendarUnit|    NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate: now];

[components setMinute:0];
[components setHour:0];
[components setSecond:0];

//this is Today's Midnight
NSDate *todaysMidnight = [calendar dateFromComponents: components];



//now timeIntervals since Midnight => in seconds
NSTimeInterval todayTimeInterval = [now timeIntervalSinceDate: todaysMidnight];

//now timeIntervals since OtherDate => in seconds
NSTimeInterval otherDateTimeInterval = [now timeIntervalSinceDate: otherDate];

if(otherDateTimeInterval > todayTimeInterval) //otherDate is not in today
{
    if((otherDateTimeInterval - todayTimeInterval) <= 86400) //86400 == a day total seconds
    {
        @"yesterday";
    }
    else
    {
        @"earlier";
    }
}
else
{
    @"today";
}


now = nil;
calendar = nil;
components = nil;
todaysMidnight = nil;

NSLog("Thank you :-)");


0

बिना ज़ोर-ज़ोर के सही और सुरक्षित समाधान, स्विफ्ट 2.2 पर काम करना और iOS 8 से पहले:

func isToday() -> Bool {
    let calendar = NSCalendar.currentCalendar()
    if #available(iOS 8.0, *) {
        return calendar.isDateInToday(self)
    }

    let todayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
    let dayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:self)

    guard let today = calendar.dateFromComponents(todayComponents),
        day = calendar.dateFromComponents(dayComponents) else {
        return false
    }

    return today.compare(day) == .OrderedSame
}

-1

यहां स्वीकृत उत्तर पर मेरा 2 प्रतिशत उत्तर निर्माण है लेकिन साथ ही नए एपीआई का समर्थन करना है। नोट: मैं ग्रेगोरियन कैलेंडर का उपयोग करता हूं क्योंकि ज्यादातर समय स्टैम्प जीएमटी होते हैं लेकिन जैसे ही आप फिट होते हैं, अपना बदल देते हैं

func isDateToday(date: NSDate) -> Bool {
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    if calendar.respondsToSelector("isDateInToday:") {
        return calendar.isDateInToday(date)
    }
    let dateComponents = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay
    let today = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: NSDate()))!
    let dateToCompare = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: date))!

    return dateToCompare == today
}

-3

मेरे समाधान की गणना है कि विभाजन के बाद 1970 से कितने दिन बीत गए और पूर्णांक भाग की तुलना करें

#define kOneDay (60*60*24)
- (BOOL)isToday {
  NSInteger offset = [[NSTimeZone defaultTimeZone] secondsFromGMT];

  NSInteger days =[self timeIntervalSince1970] + offset;
  NSInteger currentDays = [[NSDate date] timeIntervalSince1970] + offset;
  return (days / kOneDay == currentDays / kOneDay);
}

यह वास्तव में एक बुरा समाधान नहीं है। यकीन नहीं हो रहा था कि ऐसा क्यों किया गया। पूर्णांक विभाजन का उपयोग शेष को काट देगा और GMT के लिए सही होने के बाद यूनिक्स के लंबे समय के "दिनों" के मूल्य की तुलना करेगा। मुझे लगता है कि यह उन सभी के लिए सबसे स्पष्ट समाधान है।
devios1

1
@ अचिगुय: यह एक बुरा समाधान है क्योंकि यह मानता है कि प्रत्येक दिन 24 घंटे लंबा है - क्या मामला नहीं है। डेलाइट सेविंग टाइम्स दिनों के कारण 23, 24 या 25 घंटे लंबा हो सकता है।
vikingosegundo

हम्म यह सच है। हालांकि, प्रति वर्ष औसतन 24 घंटे हैं, इसलिए यह केवल एक घंटे की सबसे खराब स्थिति से दूर होगा, जैसा कि मैं इसे देखता हूं। शायद यह स्पष्ट रूप से जांचा जा सकता है।
devios1

2
@ अचिगुय: नहीं। कभी भी एक कोड का उपयोग न करें जिसमें 60 * 60 * 24 हो। या अपने सिरदर्द के साथ रहते हैं।
vikingosegundo

"secondsFromGMT" दुनिया में ज्यादातर जगहों पर साल में दो बार अचानक बदल जाता है। NSCalendar विधियों का उपयोग करने के लिए बहुत सुरक्षित है।
gnasher729

-4
NSDate *dateOne = yourDate;
NSDate *dateTwo = [NSDate date];  

switch ([dateOne compare:dateTwo])
{  
    case NSOrderedAscending:  
        NSLog(@”NSOrderedAscending”);  
        break;  

    case NSOrderedSame: 
        NSLog(@”NSOrderedSame”);  
        break;

    case NSOrderedDescending:  
        NSLog(@”NSOrderedDescending”);  
        break;  
}  

4
यह आपको यह नहीं बताता कि क्या दोनों NSDates एक ही तिथि हैं, बस जो पहले है, भले ही वे एक ही दिन हों।
डेविड कानरेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.