Domanda

Nel I Documentation Index telefono per NSDate , nella zona di discussione discutono -dateWithNaturalLanguageString:locale:, tuttavia essi non documentano il metodo altro punto della pagina.

Ho usato il metodo prima per iPhone e ha funzionato bene, anche se ho ricevuto avvertimenti. Ora che sto costruendo con -Werror (che avrebbero dovuto fare tutti insieme ^ _ ^) ho incontrato un avviso con questo.

Come faccio a sostituire le seguenti righe di codice?

NSDate *today = [NSDate dateWithNaturalLanguageString:@"today at 23:59:59"];
NSDate *tomorrow = [NSDate dateWithNaturalLanguageString:@"tomorrow at 23:59:59"];
È stato utile?

Soluzione

Un modo per farlo è con NSCalendar e NSDateComponents.

Per ottenere oggi alle 23:59:59:

NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *comps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit 
                                      fromDate:date];

[comps setHour:23];
[comps setMinute:59];
[comps setSecond:59];

NSDate *today = [calendar dateFromComponents:comps];

Per arrivare domani alle 23:59:59:

NSDate *now = [NSDate dateWithTimeIntervalSinceNow:24 * 60 * 60]; // 24h from now
NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *comps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit 
                                      fromDate:date];

[comps setHour:23];
[comps setMinute:59];
[comps setSecond:59];

NSDate *tomorrow = [calendar dateFromComponents:comps];

Altri suggerimenti

Supponiamo:

static const unsigned long seconds_per_day = 60 * 60 * 24;

È possibile ottenere subito e ora + 24 ore con:

NSDate* today = [NSDate date]; // set for today
NSDate* tomorrow = [today addTimeInterval:seconds_per_day];

Al fine di ottenere la mezzanotte per il giorno dato, è importante ricordare che NSDate* è colmato a CFDateRef, che fornisce alcune API aggiuntive si desidera utilizzare il numero verde. In particolare, è possibile convertire un NSDate ad un CFAbsoluteTime con CFDateGetAbsoluteTime:

CFAbsoluteTime abstime = CFDateGetAbsoluteTime(reinterpret_cast<CFDateRef>(myNSDate));
long long      inttime = static_cast<long long>(abstime);

inttime = (inttime / seconds_per_day) * seconds_per_day; // clips the time to midnight

NSDate* myNSDateAtMidnight = reinterpret_cast<NSDate*>(CFDateCreate(NULL,
                                                       static_cast<CFAbsoluteTime>(inttime)));

... che si può avvolgere in una funzione per arrotondare sia today e tomorrow a mezzanotte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top