Затраченное время в секундах, минутах, часах

#ios #objective-c #nsdate

#iOS #objective-c #nsdate

Вопрос:

Я хотел бы отобразить затраченное время в UILabel виде следующим образом:

  x sec | when the elapsed time is less than a minute compared to now 
 y minutes | when the elapsed time is less than a hour, but greater than 60 sec compared to now
 z hours | when the elapsed time is greater than 60 sec and 60 minutes, but less than 24 hours  1 seconds compared to now
  

Я мог бы успешно отслеживать прошедшее время, но я думаю, что это другой формат, потому что он считает секунды и минуты иначе, чем я хотел. Оно показывает затраченное время следующим образом: -9 min -5 hours -10 seconds . Чтобы заставить мое решение работать, мне понадобился бы второй и минутный формат, подобный этому, -120 sec если это было 2 минуты назад или -120 min , если это было 2 часа назад, -48 hours если это было два дня назад.

Я думаю, что это решение могло бы подойти, однако с неправильными целыми числами я каждый раз показываю минуты или секунды. Я был бы очень признателен, если бы кто-нибудь мог дать мне некоторые рекомендации, как я могу исправить проблему с минутами и секундами. Однако, если кто-то делал что-то подобное в прошлом и знает способ получше (или это плохой способ), я бы тоже попробовал.

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yy HH:mm:ss"];

NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:self.fromDate];

NSTimeInterval timeInterval = [dateFromString timeIntervalSinceNow];

NSCalendar *deviceCalendar = [NSCalendar currentCalendar];


NSDate *date1 = [[NSDate alloc] init];
NSDate *date2 = [[NSDate alloc] initWithTimeInterval:timeInterval sinceDate:date1];

unsigned int unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;


NSDateComponents *conversionInfo = [deviceCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];

NSLog(@" %d min %d hours %d seconds",[conversionInfo minute], [conversionInfo hour], [conversionInfo second]);

if ([conversionInfo second] < 60 || [conversionInfo minute] < 0 || [conversionInfo hour] < 0){

    NSString *secondString = [NSString stringWithFormat:@"%d",[conversionInfo second]];
    cell.time.text = secondString;

}

if ([conversionInfo second] > 60 || [conversionInfo minute] <= 60  || [conversionInfo hour] < 0){

    NSString *minuteString = [NSString stringWithFormat:@"%d",[conversionInfo minute]];
    cell.time.text = minuteString;

}

if ([conversionInfo second] > 60 || [conversionInfo minute] > 60 || [conversionInfo hour] >= 1){

    NSString *hourString = [NSString stringWithFormat:@"%d",[conversionInfo hour]];
    cell.time.text = hourString;

}
  

Комментарии:

1. не понимаю. пожалуйста, уточните свой вопрос 🙂

Ответ №1:

NSDateComponent вы всегда будете делить дату на эти компоненты. Так что думайте об этом так, как будто у вас есть дата 31.3.2014 15: 08:12, тогда NSDateComponent вам доставят:

  day: 31
 month: 3
 year: 2014
 hours: 15
 minutes:8
 seconds:12
  

В случае, если у вас есть разница, эти значения могут быть отрицательными, но [NSDateComponent second] например, все равно это будет просто секундная часть разницы во времени, а не вся разница во времени в формате секунд. Итак, если у меня разница во времени составляет -4 минуты и -3 секунды, [NSDateComponent second] будет -3, а [NSDateComponent minute] будет -4.

Поэтому, если вам нужно собственное описание затраченного времени, вы можете использовать timeIntervalSince1970 метод NSDate и напрямую сравнить временные метки UNIX и вычислить нужные форматы, или вы используете NSDateComponent и сверяете с правилами.. Итак, если нет часа, но есть x минут.. ваше затраченное время в секундах равно: numberOfMinutes * 60 numberOfSeconds где numberOfminutes — ваше [NSDateComponent minute] , а numberOfSeconds — ваше [NSDateComponent second]

Поэтому я бы рекомендовал вам проверять следующий порядок псевдокода:

 if (days > 0) {
   elapsed = hour   minutes/60   seconds / 3600;
} else if (hour > 0) {
   elapsed = hour*60   minutes   seconds / 60;
} else if (minute>0) {
  

и так далее..

// Отказ от ответственности: нет гарантии правильности предоставленного примера расчета

Комментарии:

1. Я думаю, что что-то подобное сработает, у меня также появилась идея при чтении вашего ответа. Может сработать, если я сначала проверю часы, если оно меньше 1, я проверю минуты, если оно меньше 1 минуты, я могу отобразить секунды и так далее..

2. Я обновил свой ответ, чтобы вы также могли увидеть, как это работает с отрицательными значениями.. Потому что вам также необходимо убедиться, что ваш оператор if проверяет правильность, как упоминал jazeee. Причина проверки, если hour > 0, не имеет смысла, если я ожидаю, что hour будет равен 0 нашему отрицательному значению.. тогда, конечно, мне нужно было бы проверить значение hour < 0 и так далее

Ответ №2:

Исходя из вашего описания, каждое значение, секунда, минута и час являются отрицательными. Это означает, что ваши сравнения неверны. Другими словами, вы должны либо использовать абсолютное значение в операторах if, либо изменить свои операторы if, чтобы они соответствовали ожидаемым значениям.

Отредактировано: возможно, с вашим кодом будет проще работать, если вы измените длительность на положительную, а затем просто поставите знак отрицания в отформатированном результате. Другими словами, если значение conversionInfo всегда отрицательное, то переключите date1 и date2. Затем при форматировании строки добавьте перед ней знак минуса.

Комментарии:

1. Он хочет, чтобы они были отрицательными из-за его описания.

2. Я думаю, основываясь на коде и описании, conversionInfo всегда будет отрицательным, и, следовательно, первое и второе утверждения if всегда будут истинными. Третий оператор if всегда будет false. Я не думаю, что это намерение. (Зачем проверять, что отрицательное число меньше 60, поскольку оно всегда будет истинным.) Я подозреваю, что логика обратная.

3. ах, теперь я понял, что вы хотели упомянуть. Да, это кажется неправильным, хотя логику можно упростить намного больше, чтобы также добиться лучшей читаемости.

4. Согласовано. Кроме того, они могли переключать date1 и date2, а затем форматировать по мере необходимости.

5. Да, было бы удобнее, потому что вы воспринимаете разницу как положительное, а не отрицательное значение.