Funktionalität und Darstellung einer Art Stoppuhr (Problem)

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

  • Funktionalität und Darstellung einer Art Stoppuhr (Problem)

    Hallo zusammen,

    ich sitz im Moment an einem kniffeligen Problem. Und zwar kann der User in meiner Mac App in einem Window ein Datum und eine Uhrzeit auswählen. Diese Auswahl wird persistent von dem App gespeichert. Nun öffnet sich bei jedem Start der Anwendung ein anderes Fenster. lädt die zuvor gespeicherten Daten und er soll initial erstmal die Differenz zwischen dem gespeicherten DAtum (Zeitpunkt) und dem jetzigen Zeitpunkt in der Form:

    TTT Tage HH Stunden MM Minuten SS Sekunden!

    Natürlich soll das ganze ab dann wie eine Uhr funktionieren.

    Alles soweit kein Problem. Mit folgenden Codeausschnitt:

    Quellcode

    1. - (void)tick:(NSTimer *)theTimer
    2. {
    3. NSTimeInterval interval = -[startDate timeIntervalSinceNow];
    4. int seconds = ((int) interval) % 60;
    5. int minutes = ((int) (interval - seconds) / 60) % 60;
    6. int hours = ((int) interval - seconds - 60 * minutes) % 3600;
    7. [elapsedTime setStringValue:[NSString stringWithFormat:@"%.1d:%.2d:%.2d", hours,
    8. minutes, seconds]];
    9. }

    konnte ich schonmal initial die Differenz anzeigen. Allerdings hatte ich da den Eindruck, dass die Berechnung nicht stimmen kann. Mein Startdatum war der 12.12.2011 16 Uhr und mein damaliges aktuelles Datum 15.12.2011.
    Angezeigt wurden mir 40 Minuten. Irgendetwas kann also nicht richtig sein. Das Hochzählen allerdings funktioniert mit einem NSTimer.
    Vielleicht hängt es damit zusammen, dass das NSDate mit dem Startdatum per Binding von einem Datepicker gesetzt wird?

    Weiterhin bin ich kein mathematischer Mensch und kann mir in der Rechnung nicht vorstellen, wie man nun Tage anzeigt und vllt. sogar Jahre, Wochen?

    Meine grundlegende Frage ist daher noch: Geht das nicht einfacher ?

    wenn ja wäre ich für ein entsprechenden Codeschnipsel sehr dankbar.

    Gruß
    MasterOP22
  • Schau dir mal "NSDateComponents" an ?

    Quellcode

    1. NSDate *toDay = [NSDate date];
    2. NSDate *later = [toDay initWithTimeIntervalSinceNow:90070];
    3. NSCalendar *calendar = [NSCalendar currentCalendar];
    4. NSUInteger calFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    5. NSDateComponents *cp = [calendar components:calFlags fromDate:toDay toDate:later options:0];
    6. NSLog(@"TAGE = %i STD = %i MIN = %i SEK = %i", [cp day], [cp hour], [cp minute], [cp second]);

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ramo ()

  • Also
    1. habe ich nie gesagt, dass es keine einfache Rechnung wäre, sondern das ich einfach bei sowas in Mathe ne Niete bin
    2. Ja das App wird dadurch langsamer
    3. Nein er wird dadurch deutlich verständlicher, weil ich die eigentliche Rechnung vergrabe bzw. Apple rechnen lasse. Was da steht ist nur noch "Stell mal den Zeitunterschied der beiden Zeitpunkte in einer Klasse da und gib mir die Stunden oder Minuten zurück". Was ist daran unverständlicher als an einer meterlangen Formel?
    4. ich teile deine Meinung nicht, dass man in dem Fall Abstand von Programmierung nehmen sollte. Man sollte vllt. mathematiklastige Bereiche besser meiden, aber grundsätzlich reicht es in der Programmierung bis 10 zählen zu können (Übertreibung). Wenn man kein Gespür für App Design und kein gutes Verständnis von OOP hat, DANN ist man vielleicht nicht der beste Entwickler, aber weißt du was, ein Mensch kann lernen! Also solltest du die Leute vielleicht mal motivieren sich weiterzuentwickeln und besser zu werden, anstatt sie zu entmutigen.
  • @gritsch: darum gehts nicht../60 /60 /24 rechnen kann ich auch. Aber wenn es um eine Einteilung geht, dass da nicht steht 1,5 Minuten 90 Sekunden sondern 1 minuten 30 sekunden, dann muss man schon ein bissel mehr rechnen und glaube mir ich hätte das schon iwie hinbekommen, aber ich schaff sowas nicht in 2 minuten. Die Mühe wollte ich mir sparen und wissen obs nicht auch einfacher geht als das hart auszurechen.
    Und zu deiner Anspielung dass ich dumm sei. menschen, die so eine Einstellung haben wie du, DIE sollten viele Jobs nicht machen.

    @macmoonshine: Ich vermute mal du hast die Info aus der Doku. Wo genau hast du das gefunden? Wie kann man das problem mit der Zeitumstellung umgehen?
  • MasterOP22 schrieb:

    @gritsch: darum gehts nicht../60 /60 /24 rechnen kann ich auch. Aber wenn es um eine Einteilung geht, dass da nicht steht 1,5 Minuten 90 Sekunden sondern 1 minuten 30 sekunden, dann muss man schon ein bissel mehr rechnen und glaube mir ich hätte das schon iwie hinbekommen, aber ich schaff sowas nicht in 2 minuten. Die Mühe wollte ich mir sparen und wissen obs nicht auch einfacher geht als das hart auszurechen.
    Und zu deiner Anspielung dass ich dumm sei. menschen, die so eine Einstellung haben wie du, DIE sollten viele Jobs nicht machen.

    @macmoonshine: Ich vermute mal du hast die Info aus der Doku. Wo genau hast du das gefunden? Wie kann man das problem mit der Zeitumstellung umgehen?


    du hast gesagt dass du eine niete in mathe bist!

    und wenn du mit division und modulo nicht umgehen kannst dann ist programmieren wirklich nicht das richtige für dich.
  • Hallo @macmoonshine !

    Ich stehe jetzt wahrscheinlich am Schlauch, aber kannst du mir bitte den "Ausgabefehler" anhand meines Beispiels erklären ?

    Quellcode

    1. NSDate *toDay = [NSDate date];
    2. NSDate *later = [NSDate dateWithTimeIntervalSinceNow:3600];
    3. NSDate *later1 = [NSDate dateWithTimeIntervalSinceNow:3600+1296000];
    4. NSDate *later2 = [NSDate dateWithTimeIntervalSinceNow:3600+1296000+2678400];
    5. NSDate *later3 = [NSDate dateWithTimeIntervalSinceNow:3600+1296000+2678400+2505600+2678400];
    6. NSCalendar *calendar = [NSCalendar currentCalendar];
    7. NSUInteger calFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    8. NSDateComponents *cp = [calendar components:calFlags fromDate:toDay toDate:later options:0];
    9. NSLog(@"JAHRE = %i MONATE = %i TAGE = %i", [cp year], [cp month], [cp day]);
    10. NSLog(@"STD = %i MIN = %i SEK = %i\n\n", [cp hour], [cp minute], [cp second]);
    11. cp = [calendar components:calFlags fromDate:toDay toDate:later1 options:0];
    12. NSLog(@"JAHRE = %i MONATE = %i TAGE = %i", [cp year], [cp month], [cp day]);
    13. NSLog(@"STD = %i MIN = %i SEK = %i\n\n", [cp hour], [cp minute], [cp second]);
    14. cp = [calendar components:calFlags fromDate:toDay toDate:later2 options:0];
    15. NSLog(@"JAHRE = %i MONATE = %i TAGE = %i", [cp year], [cp month], [cp day]);
    16. NSLog(@"STD = %i MIN = %i SEK = %i\n\n", [cp hour], [cp minute], [cp second]);
    17. cp = [calendar components:calFlags fromDate:toDay toDate:later3 options:0];
    18. NSLog(@"JAHRE = %i MONATE = %i TAGE = %i", [cp year], [cp month], [cp day]);
    19. NSLog(@"STD = %i MIN = %i SEK = %i\n\n", [cp hour], [cp minute], [cp second]);
    20. ANZEIGE:
    21. 2011-12-16 12:03:27.211 NSDateTest[2830:207] JAHRE = 0 MONATE = 0 TAGE = 0
    22. 2011-12-16 12:03:27.211 NSDateTest[2830:207] STD = 1 MIN = 0 SEK = 0
    23. 2011-12-16 12:03:27.212 NSDateTest[2830:207] JAHRE = 0 MONATE = 0 TAGE = 15
    24. 2011-12-16 12:03:27.212 NSDateTest[2830:207] STD = 1 MIN = 0 SEK = 0
    25. 2011-12-16 12:03:27.213 NSDateTest[2830:207] JAHRE = 0 MONATE = 1 TAGE = 15
    26. 2011-12-16 12:03:27.214 NSDateTest[2830:207] STD = 1 MIN = 0 SEK = 0
    27. 2011-12-16 12:03:27.214 NSDateTest[2830:207] JAHRE = 0 MONATE = 3 TAGE = 15
    28. 2011-12-16 12:03:27.215 NSDateTest[2830:207] STD = 2 MIN = 0 SEK = 0
    Alles anzeigen


    "later" ist eine Std später, "later1" ist am 31. Dezember + 1STD, "later2" ist am 31. Jänner + 1STD und "later3" am 31. März + 1STD, also nach der Umstellung auf Sommerzeit !
  • oder wenn du es besser kontrollieren willst dann stell deine Systemzeit auf 1h vor der Zeitumstellung und nimm als REchenintervall 1h nach der Zeitumstellung. Sollte dann 2 Stunden ergeben, was aber falsch ist

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Vielleicht dneke ich gerade etwas zu einfach. Aber offenbar bietet Apple da schon was an , um herauszubekommen, ob ein NSDateComponent einen diesen Umschalttage(im englischen DST) erwischt hat.

    developer.apple.com/library/ma…_ref/doc/uid/20000185-SW5

    ich werds auf jedenfall mal nachher ausprobieren, ob er an dem besagten Zeitpunkt das rafft.

    Wenn ich was brauchbares habe, werde ich das mal hierhin posten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MasterOP22 ()

  • Hallo macmoonshine, hallo @Thallius !

    Im folgenden Beispiel habe ich bei "later3" 150 Tage + 1 STD angenommen, bei "start" den 24. März 2012 und bei "ende" genau 24 Std später, also nach der Zeitumstellung. Beide Ergebnisse sind doch richtig ?

    Quellcode

    1. NSDate *toDay = [NSDate date];
    2. NSDate *start = [NSDate dateWithTimeIntervalSinceNow:3600+1296000+2678400+2505600+2073600];
    3. NSDate *ende = [NSDate dateWithTimeIntervalSinceNow:3600+1296000+2678400+2505600+2073600+86400];
    4. NSDate *later = [NSDate dateWithTimeIntervalSinceNow:3600];
    5. NSDate *later3 = [NSDate dateWithTimeIntervalSinceNow:3600+12960000];
    6. NSCalendar *calendar = [NSCalendar currentCalendar];
    7. NSUInteger calFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    8. NSDateComponents *cp = [calendar components:calFlags fromDate:toDay toDate:later options:0];
    9. NSLog(@"JAHRE = %i MONATE = %i TAGE = %i", [cp year], [cp month], [cp day]);
    10. NSLog(@"STD = %i MIN = %i SEK = %i\n\n", [cp hour], [cp minute], [cp second]);
    11. cp = [calendar components:calFlags fromDate:start toDate:ende options:0];
    12. NSLog(@"JAHRE = %i MONATE = %i TAGE = %i", [cp year], [cp month], [cp day]);
    13. NSLog(@"STD = %i MIN = %i SEK = %i\n\n", [cp hour], [cp minute], [cp second]);
    14. cp = [calendar components:calFlags fromDate:toDay toDate:later3 options:0];
    15. NSLog(@"JAHRE = %i MONATE = %i TAGE = %i", [cp year], [cp month], [cp day]);
    16. NSLog(@"STD = %i MIN = %i SEK = %i\n\n", [cp hour], [cp minute], [cp second]);
    17. AUSGABE:
    18. 2011-12-16 14:22:48.579 NSDateTest[3772:207] JAHRE = 0 MONATE = 0 TAGE = 0
    19. 2011-12-16 14:22:48.580 NSDateTest[3772:207] STD = 1 MIN = 0 SEK = 0
    20. 2011-12-16 14:22:48.580 NSDateTest[3772:207] JAHRE = 0 MONATE = 0 TAGE = 1
    21. 2011-12-16 14:22:48.581 NSDateTest[3772:207] STD = 1 MIN = 0 SEK = 0
    22. 2011-12-16 14:22:48.581 NSDateTest[3772:207] JAHRE = 0 MONATE = 4 TAGE = 28
    23. 2011-12-16 14:22:48.582 NSDateTest[3772:207] STD = 2 MIN = 0 SEK = 0
    Alles anzeigen


    Wenn ich mir aber das Ergebnis der NSDate-Objekte ausgeben lasse, so ist das Ergebnis ohne Berücksichtigung der Zeitumstellung ! Kann es sein dass hier etwas verwechselt wurde ??
    later = 2011-12-16 14:38:49 +0000
    later3 = 2012-05-14 14:38:49 +0000
    start = 2012-03-24 14:38:49 +0000
    ende = 2012-03-25 14:38:49 +0000