将float转换为datetime时出错

时间:2014-10-13 00:42:14

标签: objective-c nsdate nsdateformatter

我有这个命令在后台模式中每秒调用一次,每次调用它时我都会为我的float类型变量添加+1,并转换为日期格式:

xis = (xis + 1) / 000001;

    //The Format which you want as output
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    dateFormat.dateFormat = @"ss:mm:hh";
    [dateFormat setTimeZone:[NSTimeZone systemTimeZone]];

    //The Format in which your dateTime currently is
    NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc] init];
    dateFormat1.dateFormat = @"hh.mm";
    [dateFormat1 setTimeZone:[NSTimeZone systemTimeZone]];


    NSString *timeStr = [NSString stringWithFormat:@"%.2f",xis];
    NSDate *dates = [dateFormat1 dateFromString:timeStr];
    NSLog(@"Time: %@", [dateFormat stringFromDate:dates]);

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{

        recordTime.text = [NSString stringWithFormat:@"%@",[dateFormat stringFromDate:dates]];

    }];

但是当时间到了00:00:12时,这个代码有问题,出现了问题,时间是值(null),这可能导致了这个问题,我该如何解决呢?

1 个答案:

答案 0 :(得分:2)

有两个问题:

  1. 我建议不要使用NSTimer例程来自己跟踪已用时间。可能无法使用您期望的频率调用定时器。此外,如果用户暂停了应用程序并返回该应用程序,那么当应用程序不再位于前台时,您实际上并不想尝试保持此计时器继续运行。简而言之,您希望将UI的更新与经过时间字符串表示的计算分离。

    因此,应该捕获“开始时间”,然后让例程获取当前时间,将其与“开始时间”进行比较,并计算该经过时间的字符串表示。但值得注意的是,经过几秒钟的变量没有增加,而是应该依赖于设备的系统时间。

  2. 您的格式问题源于数字计数器到日期字符串的尴尬转换。由于向后的格式化字符串ss:mm:hh

    ,这个问题变得复杂了

    首先(以及我的上述观点),我可能会通过预先捕获开始时间并将其存储在CFAbsoluteTime属性中来计算经过的时间(以秒为单位):

    self.start = CFAbsoluteTimeGetCurrent();
    

    而且,如果您真的想使用NSDateFormatter,而不是使用它来解释数值,我只会用它来转换NSDate个对象。例如,您可以获取NSDate的{​​{1}},使用00:00:00将已用时间添加到日期,然后使用格式化程序获取输出字符串:

    dateByAddingTimeInterval

    话虽如此,我可能会赞成两种不同的方法。一种是手动计算小时,分钟和秒:

    // calculate the time elapsed in seconds
    
    CFTimeInterval elapsed = CFAbsoluteTimeGetCurrent() - self.start;
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"HH:mm:ss";
    
    NSDate *start = [formatter dateFromString:@"00:00:00"];
    NSDate *end = [start dateByAddingTimeInterval:elapsed];
    NSString *elapsedString = [formatter stringFromDate:end];
    

    或者完全不同的方法是使用// calculate the time elapsed in seconds CFTimeInterval elapsed = CFAbsoluteTimeGetCurrent() - self.start; // convert this to hours, minutes, and seconds double seconds; double minutes; double hours; seconds = modf(elapsed / 60.0, &minutes) * 60.0; minutes = modf(minutes / 60.0, &hours) * 60.0; // create format string NSString *elapsedString = [NSString stringWithFormat:@"%02.0f:%02.0f:%04.1f", hours, minutes, seconds]; 。在这种情况下,可能有一个NSCalendar属性,您可以使用开始时间进行初始化:

    NSDate

    然后你可以做类似的事情:

    self.startDate = [NSDate date];
    
  3. 只是几种方法。但我建议不要手动递增你的计数器,我可能会建议使用后一种技术。