2009-08-27 9 views
0

Dans le i Phone docset for NSDate, dans la zone de discussion, ils discutent -dateWithNaturalLanguageString:locale:, mais ils ne documentent pas la méthode ailleurs sur la page.NSDate -dateWithNaturalLanguageString: sur iPhone?

J'ai utilisé la méthode auparavant pour iPhone et cela a très bien fonctionné, même si j'ai reçu des avertissements. Maintenant que je construis avec -Werror (ce que j'aurais dû faire tout le long^_ ^) J'ai couru dans un avertissement avec ceci.

Comment remplacer les lignes de code suivantes?

NSDate *today = [NSDate dateWithNaturalLanguageString:@"today at 23:59:59"]; 
NSDate *tomorrow = [NSDate dateWithNaturalLanguageString:@"tomorrow at 23:59:59"]; 
+0

Quelle est l'erreur que vous obtenez? – arul

+1

'avertissement: 'NSDate' peut ne pas répondre à '+ dateWithNaturalLanguageString:'' – jbrennan

Répondre

2

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]; 
+0

Bingo. Merci à tous pour leur aide. – jbrennan

+0

Je n'oublierai pas NSDateComponents bientôt! – jbrennan

+0

Cette réponse est le contraire de l'intention de l'affiche originale (et de mon intérêt), je pense?Ma compréhension était qu'il voulait commencer avec une date en langage naturel "demain à 23:59:59" et obtenir un NSDate résultant. –

1

Supposons:

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é à CFDateRef, qui fournit quelques API supplémentaires que vous souhaitez utiliser. En particulier, vous pouvez 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 today et arrondir tomorrow à minuit.

+0

Où CFAbsoluteTime est-il déclaré? J'ai importé ' mais toujours pas de dés. Aussi, qu'est-ce que myUint64Type? Que devrais-je utiliser pour ça? Si c'est important, j'écris une catégorie NSDate, même si je ne pense pas que ce soit important. – jbrennan

+0

Ah, il y a une faute de frappe dans votre code, 'CFAbosoluteTime';) De toute façon, j'ai le code en cours d'exécution, mais ce n'est pas tout à fait correct. L'heure pour aujourd'hui et demain est toujours ... – jbrennan

+0

Que signifient les dates quand vous dites 'NSLog (@"% @ ", myNSDate)'? – fbrereto