2009-08-11 13 views
15

Próbuję przekonwertować wartość, np. "898.171813964844" na 00:17:02 (hh: mm: ss).Konwertuj numer NSNumber (podwójny) na czas

Jak można tego dokonać w obiektywnym c?

Dzięki za pomoc!

+0

Można użyć prostego arithmatic, ale nie widzę, jak 898.171813964844 będzie 00:17:02. Do czego odnosi się float? – Xetius

+0

Hej, w ruby ​​i proste zrobić Time.at (czas - 3600) .strftime ("% H:% M:% S") i uzyskać prawidłowy wynik. (czas jest wartością zmiennoprzecinkową) – phx

Odpowiedz

30

rozwiązanie końcowa:

NSNumber *time = [NSNumber numberWithDouble:([online_time doubleValue] - 3600)]; 
NSTimeInterval interval = [time doubleValue];  
NSDate *online = [NSDate date]; 
online = [NSDate dateWithTimeIntervalSince1970:interval];  
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"HH:mm:ss"]; 

NSLog(@"result: %@", [dateFormatter stringFromDate:online]); 
+0

Dlaczego otrzymuję coś około 8 godzin 1 minut i 34 sekund, gdy mam wartość 94.000 w moim przedziale? czy robię coś źle? – Ben

+0

@Ben - jest to prawdopodobnie spowodowane tym, że strefa czasowa ma +8 godzin. Spróbuj ustawić strefę czasową na GMT '[dateFormatter setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 0]];' –

+0

Dlaczego -3600 od czasu? –

1
  1. Konwersja wartości NSNumber do NSTimeInterval z -doubleValue
  2. Konwersja wartości NSTimeInterval do NSDate z +dateWithTimeIntervalSinceNow:
  3. Konwersja NSDate do NSString z -descriptionWithCalendarFormat:timeZone:locale:
+0

Interwał NSTimeInterval = [time doubleValue]; NSDate * date = [NSDate date]; data = [NSDate dateWithTimeIntervalSinceNow: interval]; NSString * wartość = [date descriptionWithCalendarFormat: @ "% I:% M:% S" timeZone: [NSTimeZone localTimeZone] locale: nil]; w ten sposób? Ale dostaję: ostrzeżenie NSDate może nie odpowiadać -descriptionWithCalendarFormat .... – phx

+0

Nie-przestarzałym sposobem (lub sposobem SDK na iPhone'a) konwertowania NSDate na ciąg jest użycie NSDateFormatter. – Wevah

+0

Czy próbujesz przekonwertować liczbę na czas bezwzględny (tj. Czy jest to znacznik czasu?) Lub jednostki (tj. Czy liczba to tylko sekunda?)? – Wevah

8

Zakładając, że są po prostu zainteresowani godziny, minuty i sekundy i że wartość wejściowa jest mniejsza lub równa 86400 można zrobić coś takiego:

NSNumber *theDouble = [NSNumber numberWithDouble:898.171813964844]; 

int inputSeconds = [theDouble intValue]; 
int hours = inputSeconds/3600; 
int minutes = (inputSeconds - hours * 3600)/60; 
int seconds = inputSeconds - hours * 3600 - minutes * 60; 

NSString *theTime = [NSString stringWithFormat:@"%.2d:%.2d:%.2d", hours, minutes, seconds]; 
3

znam odpowiedź została już przyjęta, ale tutaj jest moja odpowiedź za pomocą NSDateFormatter iz uwzględnieniem strefy czasowej (do godziny strefy czasowej [np. GMT + 4] są nieoczekiwanie dodano @Ben)

NSTimeInterval intervalValue = 898.171813964844; 
    NSDateFormatter *hmsFormatter = [[NSDateFormatter alloc] init]; 
    [hmsFormatter setDateFormat:@"HH:mm:ss"]; 
    [hmsFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
    NSLog(@"formatted date: %@", [hmsFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceReferenceDate:intervalValue]]); 

[marginesie] @phx Zakładając, +898,171813964844 w sekundach, w tym, że nie stanowią 00:14:58 00:17:02.