NSDate inkre/dekrementieren Problem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSDate inkre/dekrementieren Problem

    Hi zusammen,

    hab mir zwei Funktionen geschrieben, die jeweils das Datum um einen Tag erhöhen/vermindern.
    Ich hole mir das Datum aus einem Label heraus und schreibe es dann dort wieder hinein.
    Es funktioniert auch alles soweit, allerdings wird nach dem ersten Aufruf der Funktion, quasi im 2ten Aufruf,
    das Datum nach belieben erhöht oder vermindert, egal auf welchen Button ich klicke.

    Habt ihr ne Idee oder seht ihr den Fehler?

    Vielen Dank schon mal für eure Hilfe

    Quellcode

    1. -(IBAction)changeDatePlus{
    2. NSDateFormatter *df = [[NSDateFormatter alloc] init];
    3. [df setDateFormat:@"dd.MM.yyyy"];
    4. NSDate *myDate = [df dateFromString:[CurrentDate text]];
    5. NSDateComponents *components= [[NSDateComponents alloc] init];
    6. NSTimeZone * tz = [NSTimeZone localTimeZone];
    7. CFAbsoluteTime at = CFDateGetAbsoluteTime((CFDateRef)myDate);
    8. int day = CFAbsoluteTimeGetGregorianDate(at, (CFTimeZoneRef)tz).day;
    9. [components setDay:(day)+1];
    10. NSCalendar *calendar = [NSCalendar currentCalendar];
    11. NSDate *newDate = [calendar dateByAddingComponents:components toDate:myDate options:0];
    12. NSString *Datum = [df stringFromDate:newDate];
    13. CurrentDate.text = Datum;
    14. [df release];
    15. [components release];
    16. }
    17. -(IBAction)changeDateMinus{
    18. NSDateFormatter *df = [[NSDateFormatter alloc] init];
    19. [df setDateFormat:@"dd.MM.yyyy"];
    20. NSDate *myDate = [df dateFromString:[CurrentDate text]];
    21. NSDateComponents *components= [[NSDateComponents alloc] init];
    22. NSTimeZone * tz = [NSTimeZone localTimeZone];
    23. CFAbsoluteTime at = CFDateGetAbsoluteTime((CFDateRef)myDate);
    24. int day = CFAbsoluteTimeGetGregorianDate(at, (CFTimeZoneRef)tz).day;
    25. [components setDay:(day)-1];
    26. NSCalendar *calendar = [NSCalendar currentCalendar];
    27. NSDate *newDate = [calendar dateByAddingComponents:components toDate:myDate options:0];
    28. NSString *Datum = [df stringFromDate:newDate];
    29. CurrentDate.text = Datum;
    30. [df release];
    31. [components release];
    32. }
    Alles anzeigen
  • So geht es, aber man kann auch mit Daten Rechnen, ohne selbst Sekunden ausrechnen zu müssen. Das funktioniert dann auch mit anderen Einheiten als Tagen und mit anderen Kalendern als dem gregorianischen. Z.B. so:

    Quellcode

    1. NSDate* today = [NSDate date];
    2. NSCalendar* calendar = [NSCalendar currentCalendar];
    3. NSDateComponents* oneDay = [[[NSDateComponents alloc] init] autorelease];
    4. [oneDay setDay:1];
    5. NSDate* tomorrow = [calendar dateByAddingComponents:oneDay toDate:today options:0];
    6. NSLog(@"tomorrow is %@",tomorrow);
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    Thallius schrieb:

    scriptedSheep schrieb:

    dabei sind 86400 sekunden = 1 day


    Dummerweise haben wir zwei Tage im Jahr wo das nicht stimmt.

    Mit Daten selber rechnen ist ein wahnsinns aufwand wenn man wirklich korrekt sein will.


    Full ack. Nebenbei: 1972 waren es sogar vier Tage.


    und dann wäre da auch noch die Schaltsekunde :)

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    und dann wäre da auch noch die Schaltsekunde

    Hui, eben mal probiert:

    Quellcode

    1. NSCalendar* calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    2. NSTimeZone* utc = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
    3. [calendar setTimeZone:utc];
    4. NSDate* date = [NSDate dateWithTimeIntervalSince1970:78796795];
    5. NSDateComponents* oneSecond = [[[NSDateComponents alloc] init] autorelease];
    6. NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
    7. [formatter setDateStyle:kCFDateFormatterShortStyle];
    8. [formatter setTimeStyle:kCFDateFormatterFullStyle];
    9. [formatter setCalendar:calendar];
    10. [formatter setTimeZone:utc];
    11. [oneSecond setSecond:1];
    12. for (int i=0;i<10;i++) {
    13. NSLog(@"%i: %@",i, [formatter stringFromDate:date]);
    14. date = [calendar dateByAddingComponents:oneSecond toDate:date options:0];
    15. }
    Alles anzeigen

    Zeigt bei mir keine Schaltsekunde. Entweder ist das ein Fehler oder das ganze Zeug hängt irgendwie an NTP dran, ich glaube, die kennen auch keine Schaltsekunden.

    Ich bin schockiert! ;)
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    Zeigt bei mir keine Schaltsekunde. Entweder ist das ein Fehler oder das ganze Zeug hängt irgendwie an NTP dran, ich glaube, die kennen auch keine Schaltsekunden.

    Da sich die Erde relativ ungleichmäßig - zumindest aus der Sicht eines Physikers - dreht, ist eine Vorhersage der Schaltsekunden schwierig. Sie legt deswegen der Internationale Dienst für Erdrotation und Referenzsysteme fest. Damit der Kalender auch Schaltsekunden kennt, müsste er ja diese Informationen irgendwie daher bekommen.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Da sich die Erde relativ ungleichmäßig - zumindest aus der Sicht eines Physikers - dreht, ist eine Vorhersage der Schaltsekunden schwierig. Sie legt deswegen der Internationale Dienst für Erdrotation und Referenzsysteme fest. Damit der Kalender auch Schaltsekunden kennt, müsste er ja diese Informationen irgendwie daher bekommen.

    ... zumindest bis Amin endlich mal NSKristallkugel fertig macht ;)

    Schaltsekunden kommen ja nicht jeden Tag, die Datenmengen sind überschaubar. Und zumindest einige Wochen im Voraus ist es auch bekannt, das könnte man sicherlich im System pflegen. Es gäbe dann bestimmt andere Probleme, wie z.B. dass sich Daten zu Timestamps nachträglich ändern können. Aber Apple hat sich so ein schönes System für Zeitberechnungen ausgedacht, da finde ich es schon verwunderlich, dass UTC nicht UTC ist.
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    macmoonshine schrieb:

    Da sich die Erde relativ ungleichmäßig - zumindest aus der Sicht eines Physikers - dreht, ist eine Vorhersage der Schaltsekunden schwierig. Sie legt deswegen der Internationale Dienst für Erdrotation und Referenzsysteme fest. Damit der Kalender auch Schaltsekunden kennt, müsste er ja diese Informationen irgendwie daher bekommen.

    ... zumindest bis Amin endlich mal NSKristallkugel fertig macht ;)

    Hast du noch nicht in das Vortragsverzeichnis der Macoun geschaut?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    mattik schrieb:

    macmoonshine schrieb:

    Da sich die Erde relativ ungleichmäßig - zumindest aus der Sicht eines Physikers - dreht, ist eine Vorhersage der Schaltsekunden schwierig. Sie legt deswegen der Internationale Dienst für Erdrotation und Referenzsysteme fest. Damit der Kalender auch Schaltsekunden kennt, müsste er ja diese Informationen irgendwie daher bekommen.

    ... zumindest bis Amin endlich mal NSKristallkugel fertig macht ;)

    Hast du noch nicht in das Vortragsverzeichnis der Macoun geschaut?

    ...aber bis 2027 ist noch solange. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Amin Negm-Awad schrieb:

    mattik schrieb:

    macmoonshine schrieb:

    Da sich die Erde relativ ungleichmäßig - zumindest aus der Sicht eines Physikers - dreht, ist eine Vorhersage der Schaltsekunden schwierig. Sie legt deswegen der Internationale Dienst für Erdrotation und Referenzsysteme fest. Damit der Kalender auch Schaltsekunden kennt, müsste er ja diese Informationen irgendwie daher bekommen.

    ... zumindest bis Amin endlich mal NSKristallkugel fertig macht ;)

    Hast du noch nicht in das Vortragsverzeichnis der Macoun geschaut?

    Ach, das meintest Du mit "habe keine Lust, ein Paper zu schreiben" - Du kopierst einfach die Folien aus der Aufzeichnung Deines eigenen Vortrags raus, ziemlich clever ;)
    Multigrad - 360°-Produktfotografie für den Mac
  • ich hätt jetzt doch noch ne Frage :). Wenn ich zwei Dati vergleiche bzw. die Dati zuweise, bekomm ich eine NSException:
    Vielen Dank schon mal für eure Hilfe!!


    Quellcode

    1. Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDate length]: unrecognized selector sent to instance 0x69504a0'
    2. *** First throw call stack:
    3. (0x1394600 0x152c52e 0x1397550 0x12f54cf 0x12f5292 0x357af9 0x3577db 0x354746 0x5b025 0x79e759 0x7a0d33 0x65615e 0x655c5b 0x658ac5 0x65cbf4 0x607c93 0x1395d21 0x117b6ed 0x11854c1 0x110c92b 0x110e5ba 0x110deea 0x1363d6e 0x12f9ea1 0x12c40ed 0x12c393c 0x12c3868 0x1e71fef 0x1e720b4 0x5ca0c4 0x1ed8 0x1e69)
    4. terminate called throwing an exception[Switching to process 405 thread 0x207]






    Quellcode

    1. NSMutableArray *ar = [xmlcont table];
    2. ErgebnisInput *current;
    3. int rows = 0;
    4. NSDateFormatter *df = [[NSDateFormatter alloc] init];
    5. [df setDateFormat:@"yyyy-MM-dd"];
    6. NSDate *beginDate;
    7. NSDate *labelDate;
    8. NSDate *endDate;
    9. NSDate *gameDate;
    10. labelDate = [df dateFromString:currentDate]; // currentDate could be 2011-12-20
    11. beginDate = [df dateFromString:[NSDate dateWithTimeInterval:-604800 sinceDate: labelDate]]; // Hier zeigt er mit SIGABRT
    12. endDate = [df dateFromString:[NSDate dateWithTimeInterval:-604800 sinceDate: labelDate]];
    13. NSLog(@"%@", gameDate);
    14. for(int j = 0; j < [ar count]; j++){
    15. if([self date:gameDate isBetweenDate:beginDate andDate:endDate]){
    16. [DateArray addObject:[ar objectAtIndex:j]];
    17. }
    18. }....
    19. - (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate
    20. {
    21. return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));}
    Alles anzeigen