NSDate -dateWithNaturalLanguageString: sur iPhone?
-
20-09-2019 - |
Question
Dans le i téléphone pour NSDate Doc Niveau, dans la zone de discussion, ils discutent -dateWithNaturalLanguageString:locale:
, mais ils ne documentent pas la méthode ailleurs sur la page.
Je l'ai utilisé la méthode avant pour l'iPhone et cela a fonctionné très bien, même si je suis arrivé avertissements. Maintenant que je construis avec -Werror
(qui je l'ai fait tout au long de ^ _ ^) J'ai rencontré un avertissement à ce sujet.
Comment puis-je remplacer les lignes de code ci-dessous?
NSDate *today = [NSDate dateWithNaturalLanguageString:@"today at 23:59:59"];
NSDate *tomorrow = [NSDate dateWithNaturalLanguageString:@"tomorrow at 23:59:59"];
La solution
Une façon de le faire est avec NSCalendar et NSDateComponents.
Pour obtenir aujourd'hui à 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];
Pour demain à 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];
Autres conseils
Supposons que:
static const unsigned long seconds_per_day = 60 * 60 * 24;
Vous pouvez maintenant obtenir et maintenant + 24 heures avec:
NSDate* today = [NSDate date]; // set for today
NSDate* tomorrow = [today addTimeInterval:seconds_per_day];
Afin d'obtenir minuit le jour indiqué, il est important de se rappeler que NSDate*
est sans frais pontés CFDateRef
, qui fournit des API supplémentaires que vous aurez envie d'utiliser. vous pouvez en particulier convertir un NSDate
à un CFAbsoluteTime
avec 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)));
... que vous pouvez envelopper dans une fonction à la fois arrondir today
et tomorrow
à minuit.