TimeInterval计算问题

时间:2012-04-03 18:29:35

标签: objective-c ios time nsdate

我正在尝试创建一个计算时差的应用,并将金额乘以金额。它的目标是以R $(巴西雷亚尔)计算在应用计算的时间内有人必须为使用服务而支付的金额。

这是我的代码:

- (IBAction)encerrar:(id)sender {

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"HH:mm";
    NSString *temp = inicio.text;
    NSDate *then = [dateFormatter dateFromString:temp];
    NSDate *now = [NSDate date];
    NSTimeInterval timeInterval = [now timeIntervalSinceDate:then];
    NSString *ext = [dateFormatter stringFromDate:now];
    fim.text = ext;
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    NSString *timeString = [dateFormatter stringFromDate:timerDate];
    duracao.text = timeString;

    double timeIntervalInHours = (timeInterval / 3600.0) * 5;        

    NSString *vTotal = [[NSString alloc] initWithFormat:@"R$ %.2f", fecha];
    NSLog(@"%.2f", timeIntervalInHours);
    vlrTotal.text = vTotal;
}

事实是,当我们点击计算按钮时,如果duracao(持续时间)等于1h,它会给我正确的金额,即R $ 5,00。但是当持续时间等于30分钟或不同于精确1小时的其他值时,它会给出错误的数量。

I.E。:1小时应为R $ 5,00;而1:30h应该是7,50雷亚尔,但显示我R $ 6,50。

所以,任何人都可以帮我这个???

提前致谢!!!

3 个答案:

答案 0 :(得分:1)

您将时间字符串HHmm转换为浮点数,因此在1.5小时内,您将拥有130(1小时30分钟)的浮点数。我不能从那里按照你的计算。我想你想要的是有两个格式化程序,一个用于分钟,一个用几个小时,如下:

formatter.dateFormat = @"HH";
float hours = [[formatter stringFromDate:timerDate] intValue] * 1.0;
formatter.dateFormat = @"mm";
hours += [[formatter stringFromDate:timerDate] intValue]/60.0; //convert min to fractional hours and add

答案 1 :(得分:1)

timeInterval是以秒为单位的时间量,所以如果您想要它以小时和小时为单位,那么就这样做:

double timeIntervalInHours = timeInterval / 3600.0;

然后多次timeIntervalInHours次价格/小时来获得费用。

修改
根据我们的聊天,我会创建一个以“iniciar”(开始)作为标题的按钮。当他们按下那个按钮时,我会存储当前时间并将标题更改为“encerrar”(停止)。 (我希望我的翻译是正确的,哈哈)然后按钮动作看起来像这样:

// self.startTime is a NSDate.
- (IBAction)iniciar_encerrar:(UIButton *)sender {
    if ([sender.titleLabel.text isEqualToString:@"iniciar"]) {
        // We are starting the time
        if (self.startTime != nil) {
            return;
        }

        self.startTime = [NSDate date];
        [sender setTitle:@"encerrar" forState:UIControlStateNormal];
    } else {
        // We are stopping the time
        NSDate *currentTime = [NSDate date];
        NSTimeInterval elapsedTimeInSeconds = [currentTime timeIntervalSinceDate:self.startTime];
        double cost = elapsedTimeInSeconds / 3600.0 * 5.0;
        NSLog(@"%.2lf", cost);

        // reset the button
        self.startTime = nil;
        [sender setTitle:@"iniciar" forState:UIControlStateNormal];
    }
}

startTime声明如下:

在.h文件中,连同其他声明的属性,添加:

@property (strong, nonatomic) NSDate *startTime;

在.m文件中,将其添加到顶部,并添加其他文件:

@synthesize startTime;

viewDidUnload函数(在.m文件中)中添加:

startTime = nil;

这只是为您提供存储startTime日期的地方。

答案 2 :(得分:0)

我会将$ R5,00金额从每小时金额转换为每秒金额以获得更高的准确性。 5/60分钟/ 60秒为您提供.00388889,您可以乘以(持续时间* 1000)以获得准确的结果。