2009-08-27 2 views
0

In der i Phone docset for NSDate, im Diskussionsbereich diskutieren sie -dateWithNaturalLanguageString:locale:, jedoch dokumentieren sie die Methode nicht an anderer Stelle auf der Seite.NSDate -dateWithNaturalLanguageString: auf dem iPhone?

Ich habe die Methode zuvor für das iPhone verwendet und es hat gut funktioniert, obwohl ich Warnungen bekam. Jetzt, wo ich mit -Werror baue (was ich die ganze Zeit getan hätte^_ ^), habe ich eine Warnung bekommen.

Wie würde ich die folgenden Codezeilen ersetzen?

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

Was ist der Fehler, Sie bekommen? – arul

+1

'Warnung: 'NSDate' reagiert möglicherweise nicht auf '+ dateWithNaturalLanguageString:'' – jbrennan

Antwort

2

Eine Möglichkeit, dies zu tun, ist mit NSCalendar und NSDateComponents.

Um heute um 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]; 

Um morgen um 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. Danke an alle für ihre Hilfe. – jbrennan

+0

Ich werde NSDateComponents sicher nicht so schnell vergessen! – jbrennan

+0

Diese Antwort ist das Gegenteil der Absicht des ursprünglichen Posters (und meines Interesses), denke ich?Mein Verständnis war, dass er mit einem Termin für eine natürliche Sprache beginnen wollte "morgen um 23:59:59" und eine resultierende NSDate bekommen. –

1

Nehmen wir an:

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

Sie können jetzt bekommen und jetzt + 24 Stunden:

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

Um Mitternacht für den gegebenen Tag zu bekommen, ist es wichtig, sich daran zu erinnern, dass NSDate* ist gebührenfrei zu CFDateRef überbrückt, die einige zusätzliche APIs zur Verfügung stellt, die Sie verwenden möchten. Insbesondere können Sie eine NSDate zu einem CFAbsoluteTime mit CFDateGetAbsoluteTime konvertieren:

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))); 

..., die Sie in eine Funktion sowohl abzurunden today und tomorrow bis Mitternacht wickeln kann.

+0

Wo wird CFAbsoluteTime deklariert? Ich habe ' importiert, aber immer noch keine Würfel. Was ist myUint64Type? Was soll ich dafür verwenden? Wenn es darauf ankommt, schreibe ich eine NSDate-Kategorie, obwohl ich denke, dass es keine Rolle spielt. – jbrennan

+0

Ah, da ist ein Tippfehler in deinem Code, 'CFAbosoluteTime';) Jedenfalls habe ich den Code jetzt laufen, aber es ist immer noch nicht ganz richtig. Die Zeit für heute und morgen ist noch offen ... – jbrennan

+0

Wie werden die Daten gedruckt, wenn Sie 'NSLog (@"% @ ", myNSDate) sagen? – fbrereto