Mam pewną kwotę, seconds
która przeszła z pewnego wydarzenia. Jest przechowywany w NSTimeInterval
typie danych.
Chcę go przekonwertować na minutes
i seconds
.
Na przykład mam: „326,4” sekund i chcę zamienić to na następujący ciąg: „5:26”.
Jaki jest najlepszy sposób na osiągnięcie tego celu?
Dzięki.
objective-c
iphone
nstimeinterval
seconds
minute
Ilya Suzdalnitski
źródło
źródło
Krótki opis
Użyj metody NSCalendar:
(NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
„Zwraca, jako obiekt NSDateComponents przy użyciu określonych składników, różnicę między dwiema podanymi datami”. Z dokumentacji API.
Utwórz 2 NSDate, których różnicą jest NSTimeInterval, który chcesz przekonwertować. (Jeśli twój NSTimeInterval pochodzi z porównania 2 NSDate, nie musisz robić tego kroku, a nawet nie potrzebujesz NSTimeInterval).
Uzyskaj oferty od NSDateComponents
Przykładowy kod
Znane problemy
źródło
%ld
jeśli jesteś na komputerze 64-bitowym.Wszystko to wygląda na bardziej skomplikowane, niż powinno! Oto krótki i przyjemny sposób na zamianę przedziału czasu na godziny, minuty i sekundy:
Zauważ, że kiedy wstawisz float do int, automatycznie otrzymasz floor (), ale możesz dodać to do pierwszych dwóch, jeśli poczujesz się lepiej :-)
źródło
Wybacz mi, że jestem dziewicą stosu ... Nie jestem pewien, jak odpowiedzieć na odpowiedź Briana Ramsaya ...
Użycie rundy nie będzie działać dla drugich wartości między 59,5 a 59,99999. Druga wartość w tym okresie będzie wynosić 60. Zamiast tego użyj obcinania ...
źródło
Jeśli celujesz w system iOS 8 lub OS X 10.10 lub wyższy, stało się to o wiele łatwiejsze. Nowa
NSDateComponentsFormatter
klasa umożliwia przekonwertowanie podanejNSTimeInterval
wartości z jej wartości w sekundach na zlokalizowany ciąg znaków w celu wyświetlenia użytkownikowi. Na przykład:Cel C
Szybki
NSDateCompnentsFormatter
pozwala również na to, aby ten wynik był w dłuższych formach. Więcej informacji można znaleźć w artykule NSHipster's NSFormatter . W zależności od tego, z jakimi klasami już pracujesz (jeśli nieNSTimeInterval
), wygodniejsze może być przekazanie programowi formatującemu wystąpieniaNSDateComponents
lub dwóchNSDate
obiektów, co można również wykonać za pomocą następujących metod.Cel C
Szybki
źródło
switch
aniif else
oświadczeń z tym.NSDateComponentsFormatter
dba o to wszystko. Godziny, minuty, sekundy drukowane bez obaw.Kod Briana Ramsaya, pozbawiony pseudonimu:
źródło
Oto wersja Swift:
Może być używany w ten sposób:
źródło
Wyjścia:
źródło
Ponieważ jest to zasadniczo podwójne ...
Podziel przez 60.0 i wyodrębnij część całkowitą i część ułamkową.
Integralną częścią będzie cała liczba minut.
Ponownie pomnóż część ułamkową przez 60,0.
Wynikiem będą pozostałe sekundy.
źródło
Pamiętaj, że pierwotne pytanie dotyczy wyjścia w postaci łańcucha, a nie pseudokodu lub pojedynczych składników ciągu.
W wielu odpowiedziach brakuje kwestii związanych z internacjonalizacją, a większość z nich wykonuje obliczenia matematyczne ręcznie. Wszystko tak XX wieku ...
Nie wykonuj samodzielnie matematyki (Swift 4)
Dźwignia na biblioteki
Jeśli naprawdę potrzebujesz pojedynczych komponentów i przyjemnie czytelnego kodu, sprawdź SwiftDate :
Kredyty dla @mickmaccallum i @polarwar za odpowiednie wykorzystanie domeny
DateComponentsFormatter
źródło
Jak to zrobiłem w Swift (w tym formatowanie ciągu, aby pokazać go jako „01:23”):
źródło
Wersja Swift 2
źródło