2010-10-28 13 views
11

Mam aplikację, która jest podstawowym timerem. Śledzi liczbę sekund uruchomienia aplikacji. Chcę go przekonwertować, aby sekundy (NSUInteger) były wyświetlane w następujący sposób: 00:00:12 (hh: mm: ss). Tak czytałem ten post:Formatowanie sekund na hh: ii: ss

NSNumber of seconds to Hours, minutes, seconds

Z którego napisałem ten kod:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[self meeting] elapsedSeconds]]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"hh:mm:ss"]; 

to działa dobrze, ale zaczyna się o 04:00:00. Nie jestem pewien dlaczego. Próbowałem też zrobić coś takiego:

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:[[self meeting] elapsedSeconds] * -1]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"hh:mm:ss"]; 

myśląc, że będzie on wyświetlany licznik prawidłowo, ale to robi dziwne 01:23:00, a potem po prostu klapki na 04:00:00 i pozostaje tam do końca czas.

MS

+0

myślę [to] (http://stackoverflow.com/questions/4042958/how-to-find-the-difference-between-two-dates- in-hhmmss-format-in-objective-c/4043251 # 4043251) jest tym, czego szukasz. Zrobiłbyś krok 3, a 'ti' w tym kodzie jest twoim' elapsedSeconds'. Pamiętaj, aby dać odpowiedź na to pytanie (nie ja), jeśli to pomoże. – Anna

+0

Dzięki ABO. Chociaż myślałem, używając NSDateFormatter, że nie musiałbym calc wszystkie kawałki ... żadnych myśli na ten temat? –

+0

NSDateFormatter służy do formatowania dat/godzin (jak w godzinie 15), a nie do czasu trwania lub liczby sekund, które masz. – Anna

Odpowiedz

49

ten jest podobny do previous answer o czas formatowania, ale nie wymaga formatowania dat, ponieważ nie mamy do czynienia z datami więcej.

Jeśli masz liczbę sekund zapisanych jako liczba całkowita, można pracować z poszczególnymi częściami składowymi czas siebie:

NSUInteger h = elapsedSeconds/3600; 
NSUInteger m = (elapsedSeconds/60) % 60; 
NSUInteger s = elapsedSeconds % 60; 

NSString *formattedTime = [NSString stringWithFormat:@"%u:%02u:%02u", h, m, s]; 
+1

Doskonale, dlaczego poradzić sobie z bezsensem w czasie! – Andy

+0

Tak i prostego lol – Alan10977

+0

@downvoter - proszę wyjaśnić powód downwingu, abym mógł go naprawić (lub nawet samemu rozwiązać odpowiedź) – dreamlax

7

Chociaż istnieją prostsze sposoby osiągnięcia tego celu (@dreamlax ma bardzo dobry sposób) pozwól mi wyjaśnić, co jest nie tak z przykładu i przejdźmy to działa:

Po pierwsze, dlatego, że pokazuje 04:00:00 (dobrze, to chyba rzeczywiście pokazując 04:00:12), ponieważ jest to konwersja czasu z UTC/GMT do czasu lokalnego. Aby rozwiązać ten problem, należy dodać następujący wiersz:

[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

Wtedy nie będzie już pokazać 04:00:12 ponieważ nie konwertuje strefę czasową. Niestety, teraz będzie wyświetlać 12:00:12 zamiast 00:00:12, ponieważ jest północ. W celu ustalenia, które mają go przekonwertować ciąg 24-godzinny zamiast za pomocą HH formatowania zamiast hh:

[formatter setDateFormat:@"HH:mm:ss"]; 

Należy pamiętać, że ponieważ ten został zaprojektowany do pracy z czasami, że to nie będzie działać przez ponad 24 godziny (ponieważ ponownie "przejdzie" do północy).

pełny kod byłoby:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[self meeting] elapsedSeconds]]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"HH:mm:ss"]; 
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

NSLog(@"%@", [formatter stringFromDate:date]); 
// Results: 00:00:12 
Powiązane problemy