Frage

Ich versuche, etwas zu tun, dass für mich ein bisschen schwierig ist. Aber ich bin sicher, dass jemand etwas Einblick hat.

ein Datum gegeben, sagen January 17, 2011, ich, um herauszufinden, den Tag versucht, vor, dass entspricht diesem Datum ein Jahr. So January 17, 2011 ist ein Montag, und vor einem Jahr, an diesem Tag fiel auf January 18, 2010 (wie auch einen Montag). Es stellt sich heraus, dass January 18, 2010 354 Tage vor January 17, 2011 ist. Ich ursprünglich gedacht, um einfach nur 365 Tage für einen Nicht-Sprung subtrahiert Jahr und 366 Tage für ein Schaltjahr, aber wenn Sie, dass in diesem Fall tun, würden Sie bekommen January 17, 2010, die ein Sonntag ist, nicht ein Montag.

Also, in Objective-C mit NSDate und NSCalendar, wie könnte ich eine Funktion implementieren, wie:

-(NSDate *)logicalOneYearAgo:(NSDate *)from {
}

Mit anderen Worten, die n-te „Wochentag“ des n-ten Monats (wobei „Wochentag“ Montag oder Dienstag oder Mittwoch usw.)

War es hilfreich?

Lösung 5

Die Antwort stellte sich heraus, ziemlich einfach zu sein. Es stellte sich von Versuch und Irrtum heraus. Hier ist die Antwort.

, wenn das Jahr ein Schaltjahr ist, subtrahiert 365 Tage.

, wenn das Jahr kein Schaltjahr ist, subtrahiert 364 Tage.

Andere Tipps

Sie verwenden NSDateComponents etwa so:

- (NSDate *)logicalOneYearAgo:(NSDate *)from {

    NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

    NSDateComponents *offsetComponents = [[[NSDateComponents alloc] init] autorelease];
    [offsetComponents setYear:-1];

    return [gregorian dateByAddingComponents:offsetComponents toDate:from options:0];

}

Das in der Datum und Uhrzeit auf Kalenderberechnungen Führer Abschnitt Programmierung, Komponenten zu einem Datum Hinzufügen

Im Einzelnen ist das Verfahren von Interesse dateByAddingComponents toDate: Optionen

.

Mit dem Apple-Beispiel als Grundlage, ein Jahr ab dem aktuellen Datum zu subtrahieren, würden Sie Folgendes tun:

NSDate *today = [[NSDate alloc] init];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

/*
  Create a date components to represent the number of years to add to the current date.
  In this case, we add -1 to subtract one year.     
*/

NSDateComponents *addComponents = [[NSDateComponents alloc] init];
addComponents.year = - 1;

return [calendar dateByAddingComponents:addComponents toDate:today options:0];

Ich kann nicht garantieren, dies der effizienteste Weg ist, aber man konnte es NSCalendar und NSDateComponents mit tun. Fahren Sie mit NSDate Instanz in [yourCalendar components:yourComponents fromDate:yourDate], subtrahiert, um ein Jahr von den Komponenten, und verwenden Sie dann [yourCalendar dateFromComponents:yourComp].

Sorry für die nicht vollständigen Code bereitstellt, aber es ist schon eine Weile her, seit ich habe mit diesen Methoden gearbeitet, und ich will nicht, dass Ihnen den Code geben, das wird nicht funktionieren.

Substract 1 Jahr. Dann subtrahieren 1 Tag, bis Sie am selben Tag der Woche am Ende Sie wollen.

Jedes Jahr werden die „Tage der Woche“ geht zurück 1 Tag, außer wenn es einen 29. Februar dazwischen, sie gehen 2 Tage zurück.

Es ist, weil ein Jahr 52 Wochen + 1 Tag (2 Schaltjahre).

Wenn Sie also diese Logik auf unbestimmte Zeit anwenden, werden Sie am Ende, Jahre nach Jahren einen 16. Mai am 24. Juni mit.

Wenn Sie nicht wollen, dass das geschehen kann, müssen Sie irgendwo auf das Referenzjahr und Basis Ihrer Arithmetik auf es merken.

Zum Beispiel, wenn der „neue“ Montag 4 Tage zurück (weil 3 Jahre vergangen sind), können Sie es vorziehen, den Montag 3 Tage im Voraus mit der Zeit zu wählen, um nicht auf unbestimmte Zeit subtrahieren Tage, Jahre nach Jahren.

Hope es hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top