NSNumber of seconds to Hours, minutes, seconds
Asked Answered
M

4

5

I am having a terrible time trying to do something that should be easy. I have a NSNumber value of 32025.89 seconds. I need to represent that in Hours, Minutes, Seconds. Is there a method that spits that out? I can't seem to find a proper formatter.

Malonis answered 7/10, 2009 at 0:11 Comment(1)
Duplicate of #1238278 .Slighting
L
8

Have you tried creating an NSDate from that and printing that using an NSDateFormatter?

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[theNumber doubleValue]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm:ss"];
NSLog(@"%@", [formatter stringFromDate:date]); 
[formatter release];

If you need the individual values for hours, minutes, and seconds, use NSDateComponents as suggested by nall.

The above won't print the correct amounts if the NSNumber represents more than one day. It could be 1 day and 1 hour, and it would only print 01:00:00. In such a case you should calculate hours, minutes and seconds manually.

Lashonda answered 7/10, 2009 at 0:37 Comment(2)
This is more along the lines of what I was looking for. I know I could od the math but I was trying to find a way that essentially did it for me -- NSDateFormatter was I guess, what I needed. Thanks.Malonis
Using this code I had a user who got an incorrect value - instead of 03:00 for 180 seconds - they got 33:00. They were in a timezone which was 4.5 hours ahead and I wondered if the half hour in their timezone could possibly have caused this...Margalit
P
9

If you don't want to just divide it out, try this. It may be close enough for your purposes. Note: It doesn't account for sub-second precision. (setSecond takes an NSInteger).

NSDateComponents* c = [[[NSDateComponents alloc] init] autorelease];
[c setSecond:32025.89];

NSCalendar* cal = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
                   autorelease];

NSDate* d = [cal dateFromComponents:c];

NSDateComponents* result = [cal components:NSHourCalendarUnit |
                                           NSMinuteCalendarUnit |
                                           NSSecondCalendarUnit
                                  fromDate:d];

NSLog(@"%d hours, %d minutes, %d seconds",
    [result hour], [result minute], [result second]);
Profundity answered 7/10, 2009 at 0:32 Comment(0)
L
8

Have you tried creating an NSDate from that and printing that using an NSDateFormatter?

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[theNumber doubleValue]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm:ss"];
NSLog(@"%@", [formatter stringFromDate:date]); 
[formatter release];

If you need the individual values for hours, minutes, and seconds, use NSDateComponents as suggested by nall.

The above won't print the correct amounts if the NSNumber represents more than one day. It could be 1 day and 1 hour, and it would only print 01:00:00. In such a case you should calculate hours, minutes and seconds manually.

Lashonda answered 7/10, 2009 at 0:37 Comment(2)
This is more along the lines of what I was looking for. I know I could od the math but I was trying to find a way that essentially did it for me -- NSDateFormatter was I guess, what I needed. Thanks.Malonis
Using this code I had a user who got an incorrect value - instead of 03:00 for 180 seconds - they got 33:00. They were in a timezone which was 4.5 hours ahead and I wondered if the half hour in their timezone could possibly have caused this...Margalit
F
4

Here's a way without any libraries except for modf() from math.h:

float fsec = 32025.89f, frac = 0;
int milliseconds = (int)(modf(fsec, &frac) * 1000);
int isec = (int)frac;
int hours = isec / 3600;
int minutes = (isec % 3600) / 60;
int seconds = isec % 60;
Forsooth answered 7/10, 2009 at 0:38 Comment(4)
I just noticed that you divide 0 by 3600 to get hours. That's a typo, right? You means to say "fsec / 3600" right?Malonis
And what does frexp have to do with this ??Abdominal
um... it extracts the fraction part and the integer part of a floatingh pointer number. In this case, the milliseconds and seconds.Forsooth
@Sonny the frexp(fsec, &isec) call is filling in isec with the integer part of the fsec value in the process.Forsooth
L
2

NSNumber *valueForDisplay = [NSNumber numberWithDouble: [self valueForDisplay:clockName]];

NSNumber *totalDays = [NSNumber numberWithDouble:
         ([valueForDisplay doubleValue] / 86400)];
NSNumber *totalHours = [NSNumber numberWithDouble:
         (([valueForDisplay doubleValue] / 3600) -
          ([totalDays intValue] * 24))];
NSNumber *totalMinutes = [NSNumber numberWithDouble:
         (([valueForDisplay doubleValue] / 60) -
         ([totalDays intValue] * 24 * 60) -
         ([totalHours intValue] * 60))];
NSNumber *totalSeconds = [NSNumber numberWithInt:
         ([valueForDisplay intValue] % 60)];
Lalo answered 18/4, 2012 at 19:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.