#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. Да, было бы удобнее, потому что вы воспринимаете разницу как положительное, а не отрицательное значение.