2017-01-19 1 views
1

Ich versuche, einen Tag/Monat UIPickerView, kein Jahr zu erstellen. Das Ziel ist, einen Tag/Monat auszuwählen, um historische Ereignisse aufzulisten, die an diesem Tag/Monat passiert sind.Maximale Tage in einem Monat mit NSCalendar

wird die maximale Anzahl von Tagen in jedem Monat erhalten, d. H. 31 im Gregorianischen Kalender. Was ich wirklich will, ist etwas in Richtung

[calendar maximumRangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarMonth unit:2] 

, die 29 für Februar im Gregorianischen Kalender zurückkehren würde.

Von dem, was ich sehen kann, hat das einzige in der Nähe ein forDate: was nicht hilfreich ist. Ein schneller Hack wäre, das für ein Datum in einem Bereich von 8 Jahren zu verwenden (um nicht Schaltjahre Jahrhunderte zu behandeln), aber das würde für andere Kalendertypen mit unterschiedlichen Schaltjahrregeln nicht funktionieren.

Haben Sie Vorschläge, wie Sie dies erreichen können?

+0

Können Sie etwas erweitern, was Sie im Picker zeigen und wie Sie ihn verwenden? Zeigt Ihr Picker ein Jahr sowie einen Tag und einen Monat an? –

+0

Wie angegeben, Tag/Monat, überhaupt kein Jahr, wenn ein Jahr enthalten wäre, würde das Problem nicht bestehen, da der vorhandene UIDatePicker verwendet werden könnte oder die forDate: -Nachricht das Problem lösen würde. –

+0

@DavidKnight - Seine Frage, glaube ich, ist, dass er 29 für Februar will, unabhängig davon, ob er dies am 1. Februar 2017 tut, das nur 28 Tage hat (daher sein Kommentar, dies für 8 Jahre zu wiederholen, aber besorgt darüber dies ist für nicht-Gregorianische Kalender möglicherweise nicht ausreichend). – Rob

Antwort

1

NSCalendar bietet nicht direkt die Funktion, nach der Sie fragen. Da Sie andere Kalender unterstützen möchten, ist Ihre beste Wette in der Tat über viele Ära/Jahr/Monat-Kombinationen zu durchlaufen, -[NSCalendar rangeOfUnit:inUnit:forDate:] aufrufen. Acht Jahre werden nicht ausreichen, da (zum Beispiel) der hebräische Kalender (glaube ich) ein 19-Jahres-Zyklus ist.

Also note that other calendars (e.g. the Chinese calendar) have more than just the two eras (BCE/CE) of the Gregorian calendar, so sollten Sie die Ära sowie das Jahr und Monat variieren.

Wenn dies teuer ist, könnten Sie ein Befehlszeilenprogramm schreiben, das das tut, und Quellcode für eine Tabelle ausgibt, die Sie in Ihre App einbetten. Dann können Sie das Programm als Build-Schritt vor der Kompilierung ausführen.

Wenn Sie entsprechenden Zugriff auf die Datenbank historischer Ereignisse haben, wäre ein anderer Ansatz, jedes tatsächlich in der Datenbank verwendete Datum zu finden und sicherzustellen, dass Ihre Bereiche diese Daten abdecken.

+0

Ich möchte nicht-Gregorian wenn möglich unterstützen, daher die Frage. –

+0

Ich habe meine Antwort aktualisiert. –

+0

Ja, acht war nur ein Beispiel für Gregorian. Dein Vorschlag vor der Kompilierung sieht wie der Weg nach vorne aus. –

Verwandte Themen