NSNumber of seconds to Hours, minutes, seconds

前端 未结 4 1050
情深已故
情深已故 2020-12-06 07:47

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

相关标签:
4条回答
  • 2020-12-06 08:08

    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)];
    
    0 讨论(0)
  • 2020-12-06 08:12

    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;
    
    0 讨论(0)
  • 2020-12-06 08:20

    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.

    0 讨论(0)
  • 2020-12-06 08:22

    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]);
    
    0 讨论(0)
提交回复
热议问题