Ich habe einen Code, mit dem ich Kalenderdaten sortieren kann, die so aussehen:
#if !(TARGET_IPHONE_SIMULATOR)
NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
locale:[NSLocale currentLocale]];
[fmt setDateFormat:formatString];
#else
[fmt setDateFormat:@"HH:mm dd MMM yyyy"];
#endif
Wenn ich es im Simulator laufen lasse, ist alles in Ordnung. Wenn ich es auf dem Gerät ausführe, erhalte ich diese sarkastische Debug-Meldung.
2012-09-19 22: 40: 13.972 APPNAME [4923: 907] * - [__ NSCFCalendar-Komponenten: fromDate:]: Datum darf nicht Null sein
Ich meine wirklich, was denkst du, soll eine Operation mit einem Null-Datum bedeuten?
Eine Ausnahme wurde vorerst vermieden.
Einige dieser Fehler werden mit dieser Beschwerde gemeldet, dann werden weitere Verstöße einfach stillschweigend das tun, was zufällig aus dem Nullpunkt resultiert. Hier ist die Rückverfolgung, in der dies diesmal aufgetreten ist (einige Frames fehlen möglicherweise aufgrund von Compiler-Optimierungen):
Sie müssen darüber lachen, aber ich bin mir nicht sicher, was mit meinem dateFormatFromTemplate:
Code nicht stimmt . Jede Hilfe wäre dankbar.
Xcode V 4.5 übrigens ausführen
AKTUALISIEREN:
Rückverfolgung:
0 CoreFoundation 0x39ff0e55 + 84
1 APPNAME 0x00040be1 - [MeetingsViewController dateAtBeginningOfDayForDate:] + 140
Ich denke, meine dateAtBeginningOfDayForDate
Methode läuft schlecht . Welches sieht so aus:
/*
Break down a given NSDate to its bare components for sorting
*/
- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate
{
// Use the user's current calendar and time zone
NSCalendar *calendar = [NSCalendar currentCalendar];
NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
[calendar setTimeZone:timeZone];
// Selectively convert the date components (year, month, day) of the input date
NSDateComponents *dateComps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:inputDate];
// Set the time components manually
[dateComps setHour:0];
[dateComps setMinute:0];
[dateComps setSecond:0];
// Convert back
NSDate *beginningOfDay = [calendar dateFromComponents:dateComps];
return beginningOfDay;
}
Ich verwende diese Methode, um ein bestimmtes NSDate in seine Kernkomponenten zu zerlegen, damit ich sie alle effizienter sortieren kann. Meine App muss jedoch international sein, was der Grund für die NSLocale
Formatierung der Datumsausgabe ist. Wie es scheint, muss ich meine ändern dateAtBeginningOfDayForDate
, um auch international zu arbeiten.
quelle
formatString
?inputDate
muss seinnil
. Schauen Sie sich die Frames mit dem höheren Stapel an und prüfen Sie, ob Sie herausfinden können, was dasnil
Eingabedatum senden könnte .Antworten:
Der Fehler tritt in dem von Ihnen geposteten Code nicht auf. Es bedeutet, dass Sie irgendwo etwas haben, das ein sein soll,
NSDate
und stattdessen ist esnil
.Was den Humor in der Fehlermeldung betrifft, habe ich diese Meldung noch nie gesehen, aber +1 an Apple. Einige Ingenieure in der Cocoa-Abteilung sind so lustig wie die guten alten Ingenieure, die Apple vor langer Zeit hatte.
Schauen Sie sich die Art der Diagnose an, mit der der MPW C-Compiler von Apple http://www.netfunny.com/rhf/jokes/91q3/cerrors.html ausspuckt
quelle
[fmt setDateFormat:@"HH:mm dd MMM yyyy"];
es gut läuft. Ich gehe also davon aus, dassdateFormatFromTemplate:
das irgendwie falsch ist.Vielen Dank an nneonneo, der mir geholfen hat, das herauszufinden.
Mein Problem ist, dass meine App international funktionieren muss, sodass ich Daten für die Anzeige in Bezug auf den Benutzerstandort benötigte. Ich dachte, ich würde einfach ein
NSDateFormatter
Gebietsschema für den Benutzer erstellen und dann ein Zeichenfolgendatum wie folgt übergeben:Das Problem ist jedoch, dass ich das Datumsformat lokalisiert habe, bevor ich das Zeichenfolgendatum übergeben habe. In meinem Fall
NSDateFormatter
sah es nach der Lokalisierung so aus.Welches ich das Format nach der Lokalisierung könnte viele verschiedene Möglichkeiten nach der Lokalisierung aussehen.
Das Übergeben eines Strings mit dem Format von
HH:mm dd MMM yyyy
führte also zur Rückkehrnil
.Was jetzt offensichtlich ist -.-
Anstatt zu lokalisieren, wann ich das Datum erstelle, erstelle ich die Daten mit einem Standardformat von
HH:mm dd MMM yyyy
. Bei der Anzeige formatiere ichNSDate
dann das jeweilige Gebietsschema des Benutzers.quelle