【问题标题】:NSNumber of seconds to Hours, minutes, secondsNSNumber of seconds to Hours, minutes, seconds
【发布时间】:2009-10-07 00:11:10
【问题描述】:

我在尝试做一些应该很容易的事情时遇到了很糟糕的事情。我的 NSNumber 值为 32025.89 秒。我需要用小时、分钟、秒来表示。有没有吐出来的方法?我似乎找不到合适的格式化程序。

【问题讨论】:

标签: objective-c cocoa nsnumber


【解决方案1】:

您是否尝试过从中创建NSDate 并使用NSDateFormatter 打印?

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

如果您需要单独的小时、分钟和秒值,请按照 nall 的建议使用 NSDateComponents

如果NSNumber 表示超过一天,则上述内容不会打印正确的金额。它可能是 1 天 1 小时,它只会打印 01:00:00。在这种情况下,您应该手动计算小时、分钟和秒。

【讨论】:

  • 这更符合我的要求。我知道我可以计算数学,但我试图找到一种基本上为我完成它的方法——我猜 NSDateFormatter 是我需要的。谢谢。
  • 使用此代码,我有一个用户得到了不正确的值 - 而不是 03:00 持续了 180 秒 - 他们得到了 33:00。他们所在的时区提前了 4.5 小时,我想知道他们所在时区的半小时是否可能导致这种情况......
【解决方案2】:

如果你不想把它分开,试试这个。对于您的目的,它可能足够接近。 注意:不考虑亚秒级精度。 (setSecond 采用 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]);

【讨论】:

    【解决方案3】:

    这是一种没有任何库的方法,除了来自math.hmodf()

    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 除以 3600 得到小时数。那是一个错字,对吧?你的意思是说“fsec / 3600”对吧?
    • 那么frexp和这个有什么关系??
    • 嗯...它提取浮点指针数的小数部分和整数部分。在这种情况下,毫秒和秒。
    • @Sonny frexp(fsec, &isec) 调用在进程中用 fsec 值的整数部分填充 isec。
    • 啊我的错。 modf 是我的意思!谢谢
    【解决方案4】:

    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)];
    

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多