এনএসডিট আজ হয় কীভাবে তা নির্ধারণ করবেন?


156

NSDateআজকের কোনটির সাথে সম্পর্কিত কিনা তা কীভাবে পরীক্ষা করবেন ?

আমি এটি থেকে প্রথম 10 টি অক্ষর ব্যবহার করে এটি পরীক্ষা করে দেখতাম [aDate description][[aDate description] substringToIndex:10]স্ট্রিংটি "YYYY-MM-DD"এমনভাবে ফিরে আসে যাতে আমি স্ট্রিংটির সাথে স্ট্রিংটি তুলনা করি [[[NSDate date] description] substringToIndex:10]

চেক করার আরও কি দ্রুত এবং / বা ঝরঝরে উপায় আছে?

ধন্যবাদ।


আমি বিশ্বাস করি যে আমার পদ্ধতিটি একমাত্র (এটি আমার লেখার মতো) যা আসলে অ্যাপলের ডকুমেন্টেশনগুলিকে বোঝায় এবং দু'দিন একই কিনা তা নির্ধারণ করার জন্য তারা এর মধ্যে যা পরামর্শ দেয় তা করে। যদিও অন্যান্য পদ্ধতিগুলি কাজ করতে পারে তবে আমি বিশ্বাস করি যে আমার পদ্ধতিটি সবচেয়ে ভবিষ্যতের প্রমাণ। stackoverflow.com/a/17641925/901641
ArtOfWarfare

@ আর্টঅফ ওয়ারফেয়ার: আমি একমত নই। আপনার কোড এখনো সময় অন্তর সঙ্গে মোকাবিলা করার জন্য প্রয়োজন, কিন্তু আপেল পদ্ধতি ইতিমধ্যে দূরে এই ফ্যাক্টর উপলব্ধ করা হয় - দেখুন: stackoverflow.com/a/17642033/106435
vikingosegundo

1
এনএসডিট "বিবরণ" পদ্ধতিটি ইউটিসি ফর্ম্যাটে তারিখটি প্রদর্শন করে, এটি গ্রিনউইচ গড় সময়, দিবালোক সঞ্চয় সময়ের কোনও সংশোধন ছাড়াই। আপনি যদি মার্কিন যুক্তরাষ্ট্রে সন্ধ্যায় দেরি করেন, বা ভারতে খুব সকালে, এটি আপনার ক্যালেন্ডার অনুযায়ী "আজ" কী তা প্রদর্শন করবে না। NSDate কে একদিনে অনুবাদ করতে এবং বর্তমান তারিখটিকে একদিনে রূপান্তর করতে আপনার একটি এনএসক্যালেন্ডার অবজেক্ট দরকার then
gnasher729

উত্তর:


308

ম্যাকোস 10.9+ এবং আইওএস 8+ তে, এনএসক্যালেন্ডার / ক্যালেন্ডারে একটি পদ্ধতি রয়েছে যা ঠিক এটি করে!

- (BOOL)isDateInToday:(NSDate *)date 

সুতরাং আপনি সহজভাবে করতে চাই

উদ্দেশ্য গ:

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

সুইফট 3:

let today = Calendar.current.isDateInToday(date)

1
আইওএস 8 এসডিকে ব্যবহার করে দেখুন
ক্যাটফিশ_মান

1
আমি উপরের মন্তব্যে বিভ্রান্ত হয়েছি, এটি অবশ্যই আইওএস 8: - (BOOL) #DateInToday: (এনএসডিট *) তারিখ এনএস_আভিএআইবিএল (10_9, 8_0);
পাওয়ারj1984

হ্যাঁ, আমি যা বলেছিলাম। আগের কমেন্টারটি আইওএস 7 এসডিকে সম্ভবত বিভ্রান্ত করে দেখে বিভ্রান্ত হয়েছিল। এটির একটি আলাদা ঘোষণা ছিল।
ক্যাটফিশ_মান

'আজ' এর জন্য এটিই সঠিক উত্তর :)
দাইজ-দাজন

দুর্দান্ত উত্তর!
সুপারটেকনোবফ

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
}

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


SO তে অনেক উত্তর সহ নোট করুন, 7 বছর পরে এটি সম্পূর্ণ পুরানো। সুইফটে এখন কেবল ব্যবহার করুন.isDateInToday


1
ধন্যবাদ। আমি মনে করি এটি আমার প্রশ্নের আরও পরিচ্ছন্ন এবং ভবিষ্যত-নিরাপদ সমাধান।
Seunghoon

1
আমি মনে করি আপনাকেও যুগের উপাদানটি অন্তর্ভুক্ত করতে হবে। আমি মনে করি এটি দুটি পদ্ধতির মধ্যে একটি কয়েন টস; isEqualToDate দেখতে ভাল লাগছে, তবে এটি কিছুটা অপব্যয়কর বলে মনে হচ্ছে এবং উপাদানগুলির থেকে একটি তারিখ পুনর্গঠন করতে একই সংখ্যক লাইন লাগবে।
ক্রিস পেজ

1
যেহেতু "অন্যান্য ডে" এবং "আজ" উভয়ই কেবলমাত্র সেই চারটি ক্ষেত্রই ভরাট করে রেখেছে (এটিই আপনি অনুরোধ করেছেন), আপনি দ্বিতীয়টিতে হুপ না করে কেবল [আজকের সমতুল্য: অন্যান্য ডে] ব্যবহার করতে পারেন।
গ্লেন মেইনার্ড

@ গ্লেন আপনি কি পরামর্শ দিচ্ছেন আমি প্রথমটির সাথে এনএসডিটকম্পন্টগুলির তুলনা করব? আমি সত্যিই এটি সম্পর্কে ভাবি না, তবে এটি একটি ভাল ধারণা বলে মনে হয়।
ডেভিড কানারেক

1
@ ডেভিডকানারেক পুরানো পোস্টগুলি খনন করে ... আমি সরাসরি তারিখের উপাদানগুলির তুলনা করার পরামর্শ দেব না, আপনি যদি এমন পরিস্থিতির মধ্যে চলে যান যেখানে আপনাকে কোনও একটি উপাদানকে অফসেট করার প্রয়োজন হয়, আপনি মাস == 3, দিন == 34 এর মতো কিছু পেতে পারেন। তারিখগুলিতে রূপান্তরিতকরণ এপ্রিল 3 হিসাবে এটি সঠিকভাবে ব্যাখ্যা করবে, তারিখের উপাদানগুলির সাথে তুলনা করার তারিখের উপাদানগুলি এটিকে মাস == 4, দিন == 3 হিসাবে দেখতে পাবে না
শান ক্লেডেক

27

এটি আপনার প্রশ্নের একটি অফসুট, তবে আপনি যদি "আজ" বা "গতকাল" দিয়ে কোনও এনএসডিট মুদ্রণ করতে চান তবে ফাংশনটি ব্যবহার করুন

- (void)setDoesRelativeDateFormatting:(BOOL)b

এনএসডিট ফরমেটারের জন্য


3
চতুর ধারণা। তবে আমি ধরে নিয়েছি যে "আজ" স্ট্রিংটির সন্ধানটি যদি আপনি স্থানীয় করেন তবে ব্রেক হয়ে যাবে।
তুলিল বাউর্ক

16

আমি আজকের তারিখটি মধ্যরাত এবং দ্বিতীয় তারিখকে স্বাভাবিক করার চেষ্টা করব, মধ্যরাতে স্বাভাবিক হয়ে যাই তবে যদি এটি একই এনএসডি হয় তবে তুলনা করব।

একটি অ্যাপলের উদাহরণ থেকে আপনি আজকের তারিখের মধ্যরাতকে কীভাবে স্বাভাবিক করবেন, দ্বিতীয় তারিখের জন্য একই করুন এবং তুলনা করুন:

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

আমার মনে হয় আপনারও যুগকে অন্তর্ভুক্ত করা দরকার।
ক্রিস পৃষ্ঠা

12 তারিখ, মধ্যাহ্ন নয়, মধ্যরাতের সময় নির্ধারণ করে কোনও তারিখকে সাধারণ করা উচিত নয়? যেহেতু তারিখটি GMT এ রয়েছে, তাই মধ্যাহ্নে সেট করা উভয় উপায়েই সময় অঞ্চল ভেদগুলি নিশ্চিত করে (এবং তারা কেবল দুটি পথে চলে) আগের দিন বা পরে দিনের মধ্যে 'লাফ' দেয় না।
আর্টুরাস

13

ক্যাটফিশ_মানের পরামর্শের কার্যকারিতা সুইফট 3 এবং 4 সম্প্রসারণ :

extension Date {

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

}

12

উপাদানগুলি, যুগ এবং স্টাফের সাথে জাগ্রত করার দরকার নেই।

এনএসসিএল্যান্ডার একটি বিদ্যমান তারিখের জন্য নির্দিষ্ট সময় ইউনিটের শুরু পেতে একটি পদ্ধতি সরবরাহ করে।

এই কোডটি আজ এবং অন্য তারিখের সূচনা পাবে এবং এটির তুলনা করবে। যদি এটির মূল্যায়ন হয় তবে 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)
}

সুইফট ২.০ এ আমার জন্য কাজ করেছেন


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

"পারফর্মিং ক্যালেন্ডার গণনা" [লিঙ্ক] শিরোনামে অ্যাপলের ডকুমেন্টেশন এন্ট্রি পড়ুন ।

১৩ পৃষ্ঠার তালিকাভুক্তকরণ পরামর্শ দিচ্ছে যে দিনের মধ্যে মধ্যরাতের সংখ্যা নির্ধারণ করতে আপনি ব্যবহার করুন:

- (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 টাইমজোনটিতে না থাকে।
Andreas Ley

5

আপনি নিজের তারিখ এবং বর্তমান তারিখের মধ্যে সময় ব্যবধানও পরীক্ষা করতে পারেন:

[myDate timeIntervalSinceNow]

এটি আপনাকে মাইডেট এবং বর্তমান তারিখ / সময়ের মধ্যে সেকেন্ডে সময় ব্যবধান দেবে।

লিঙ্ক

সম্পাদনা: প্রত্যেককে নোট করুন: আমি ভালভাবে জানি যে [মাইডেট টাইমআইন্টারওয়ালসিনস নও] নির্দ্বিধায় নির্ধারণ করে না যে আজ মাইডিট আছে কিনা।

আমি এই উত্তরটি এইভাবে রেখে দিচ্ছি যাতে কেউ যদি অনুরূপ কিছু সন্ধান করে এবং [মাইডেট টাইমইন্টারভালসিন্স নও] দরকারী হয় তবে তারা এটি এখানে খুঁজে পেতে পারে।


1
আপনি যা বলছেন তা সঠিক, তবে অন্তর অন্তর সত্যই আজ তারিখটি কিনা তা পরীক্ষা করতে সহায়তা করে না।
জানুস

3
কেবল মনে রাখবেন যে এখন থেকে ২৪ ঘন্টার মধ্যে আপনি এটি রয়েছেন এটি যদি আপনাকে জানায় তবে তারিখগুলি একই হয় না। একটি দ্বিতীয় পার্থক্য বিভিন্ন তারিখ হতে পারে এবং একটি 86399 দ্বিতীয় পার্থক্য একই তারিখ হতে পারে।
ডেভিড কানারেক

@ ডেভিড: সত্য। প্রশ্নের উত্তর দেওয়ার সময় আমি আরও 3 টি কাজ করছিলাম বলে সে সম্পর্কে ভেবে দেখিনি এবং পৃষ্ঠাটি লোড করার সময় আপনার উত্তর পোস্ট করা হয়নি।
আলেস্প্লিন

1
এটি প্রশ্নের কোনও উত্তর দেয় না। আপনার এটি মুছে ফেলা উচিত।
ভাইকিংগুন্ডো

1
এই উত্তরটি গোলমাল ছাড়া কিছুই নয়। এটি প্রশ্নের উত্তর দেওয়ার চেষ্টা করে না বা এটি timeIntervalSinceNowঅন্যান্য পোস্টে আচ্ছাদিত হিসাবে উল্লেখ করার প্রয়োজন হয় না। সেকেন্ডের জন্য পরীক্ষার সাথে দিনের তুলনা পরিচালনা করা 86400 দ্বারা ত্রুটি-প্রবণ বিভাগকে উত্সাহ দেয়
ভাইকিংগুন্ডো

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 নম্বর সহ কোড ব্যবহার করা প্রত্যেকে তার মাথাব্যথার কারণ হতে পারে।
ভাইকিংগুন্ডো

2

উপরের উত্তরগুলির চেয়ে অনেক সহজ উপায়!

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

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

1
ক্যাটফিশ_মন এর উত্তর হিসাবে একই!
থানহ ফাম

0

এটি সম্ভবত একটি এনএসডিট ক্যাটাগরি হিসাবে আবার কাজ করা যেতে পারে, কিন্তু আমি ব্যবহার করেছি:

// 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আপনি যখন তাত্ক্ষণিকভাবে শূন্যতে সেট করছেন তখন তৈরি করার সময় কেন ঘন্টা, মিনিট এবং সেকেন্ড অন্তর্ভুক্ত করবেন? এছাড়াও, আমি মনে করি আপনাকে যুগকে অন্তর্ভুক্ত করা দরকার।
ক্রিস পৃষ্ঠা

দয়া করে মনে রাখবেন যে এটি প্রায় প্রতিটি ক্ষেত্রে কাজ করবে, লিপ সেকেন্ডের মতো জিনিস রয়েছে। অ্যাপলের এনএসডিট শ্রেণি তাদের পরিচালনা করে কিনা তা আমি জানি না, তবে কিছুটা সুযোগ রয়েছে এটি কাজ করবে না। এগুলি আপনার পদ্ধতির সমালোচনা না হয়ে বরং "you আপনি কি জানতেন" কারণ তারা অত্যন্ত বিরল (ইতিহাসে 24)।
ডেভিড কানারেক

24 ঘন্টা দীর্ঘ নয় এমন ডেটলাইট সেভিং টাইমসের কারণে 23 বা 25 দিনের তারিখগুলি সম্পর্কে কী বলা যায়?
ভাইকিংগুন্ডো

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

জোর-মোড়ক ছাড়াই সঠিক এবং নিরাপদ সমাধান, সুইফট ২.২ এ এবং আইওএস 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 ঘন্টা দীর্ঘ হতে পারে।
ভাইকিংগুন্ডো

হুঁ এটা সত্য। তবে প্রতি বছর গড় হুবহু 24 ঘন্টা, সুতরাং এটি কেবল এক ঘন্টার মধ্যে সবচেয়ে খারাপ পরিস্থিতি দ্বারা বন্ধ হয়ে যাবে, আমি এটি দেখছি। সম্ভবত এটি পরিষ্কারভাবে পরীক্ষা করা যেতে পারে।
devios1

2
@ শাইগুই: না কেবল কখনও এমন কোড ব্যবহার করবেন না যাতে 60 * 60 * 24 থাকে। বা আপনার মাথা ব্যাথা নিয়ে বেঁচে থাকুন।
ভাইকিংগুন্ডো

"সেকেন্ডফ্র্যামজিএমটি" বিশ্বের বেশিরভাগ জায়গায় বছরে হঠাৎ করে পরিবর্তন হয় changes এনএসক্যালেন্ডার পদ্ধতিগুলি ব্যবহার করা আরও নিরাপদ।
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
উভয় এনএসডিট একই তারিখ হয় কিনা, এটি একই দিন হওয়া সত্ত্বেও এটি আপনাকে জানায় না।
ডেভিড কানারেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.