7 Stimmen

Anzahl der Tage in einem bestimmten Jahr mit iPhone SDK?

Ich versuche, die Anzahl der Tage in einem laufenden Jahr zu ermitteln.

Wenn ich die Lösung unter Anzahl der Tage im aktuellen Monat mit iPhone SDK? und NSMonthCalendarUnit durch NSYearCalendarUnit ersetzen, erhalte ich immer noch die Anzahl der Tage für diesen Monat.

Weiß jemand, wie ich das machen soll?

Vielen Dank im Voraus für Ihre Hilfe.

8voto

Sam Soffes Punkte 14520

Hier ist eine supergenaue NSCalendar Erweiterung in Swift 2:

extension NSCalendar {
    func daysInYear(date: NSDate = NSDate()) -> Int? {
        let year = components([NSCalendarUnit.Year], fromDate: date).year
        return daysInYear(year)
    }

    func daysInYear(year: Int) -> Int? {
        guard let begin = lastDayOfYear(year - 1), end = lastDayOfYear(year) else { return nil }
        return components([NSCalendarUnit.Day], fromDate: begin, toDate: end, options: []).day
    }

    func lastDayOfYear(year: Int) -> NSDate? {
        let components = NSDateComponents()
        components.year = year
        guard let years = dateFromComponents(components) else { return nil }

        components.month = rangeOfUnit(NSCalendarUnit.Month, inUnit: NSCalendarUnit.Year, forDate: years).length
        guard let months = dateFromComponents(components) else { return nil }

        components.day = rangeOfUnit(NSCalendarUnit.Day, inUnit: NSCalendarUnit.Month, forDate: months).length

        return dateFromComponents(components)
    }
}

Sie können ihn wie folgt verwenden:

let calendar = NSCalendar.currentCalendar() // I'm using the Gregorian calendar
calendar.daysInYear()     // 365 (since it's currently 2015)
calendar.daysInYear(2016) // 366 (leap year!)

Das ist sehr flexibel, da wir nichts über die Länge des Kalenders voraussetzen:

let hebrew = NSCalendar(calendarIdentifier: NSCalendarIdentifierHebrew)
hebrew?.daysInYear(-7)   // 354
hebrew?.daysInYear(-100) // 384

Viel Spaß!

5voto

kubi Punkte 46128

Wenn Sie nur den gregorianischen Kalender verwenden wollen, können Sie ihn manuell berechnen.

http://en.wikipedia.org/wiki/Leap_year#Algorithm

if year modulo 400 is 0 then leap
 else if year modulo 100 is 0 then no_leap
 else if year modulo 4 is 0 then leap
 else no_leap

5voto

Godisemo Punkte 1823

Ich habe schließlich eine Lösung gefunden, die funktioniert. Ich berechne zunächst die Anzahl der Monate im Jahr und dann für jeden Monat die Anzahl der Tage für diesen Monat.

Der Code sieht wie folgt aus:

NSUInteger days = 0;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *today = [NSDate date];
NSDateComponents *components = [calendar components:NSYearCalendarUnit fromDate:today];
NSUInteger months = [calendar rangeOfUnit:NSMonthCalendarUnit
                                   inUnit:NSYearCalendarUnit
                                  forDate:today].length;
for (int i = 1; i <= months; i++) {
    components.month = i;
    NSDate *month = [calendar dateFromComponents:components];
    days += [calendar rangeOfUnit:NSDayCalendarUnit
                           inUnit:NSMonthCalendarUnit
                          forDate:month].length;
}

return days;

Es ist nicht so ordentlich, wie ich es mir erhofft hätte, aber es funktioniert für jeden Kalender, sei es der normale gregorianische oder der islamische.

1voto

Krumelur Punkte 28923

を使用します。 NSCalendar y NSDateComponent Klassen, etwa so:

long GetDaysInYear(int year) {
    NSDateComponents* c = [[NSDateComponents alloc] init];
    c.year = year;
    NSCalendar* cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate* startDate = [cal dateFromComponents:c];
    c.year += 1;
    NSDate* endDate = [cal dateFromComponents:c];
    return [cal components:NSDayCalendarUnit fromDate:startDate toDate:endDate options:0].day;
}

0voto

iTux Punkte 1806

Ein Beispiel:

func daysInYear(year: Int) -> Int {
   var calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
   var b = NSDate.dateWithNaturalLanguageString("01.01.\(year)", locale: NSLocale.currentLocale()) as! NSDate
   var e = NSDate.dateWithNaturalLanguageString("12.31.\(year)", locale: NSLocale.currentLocale()) as! NSDate

   return calendar!.components(NSCalendarUnit.CalendarUnitDay, fromDate: b, toDate: e, options: nil).day + 1 
}

Aber Standard Tage zurück 355 und 354 dies verursacht (kann sein), dass die Zählung von Null beginnen :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X