NSTimeInterval для NSDate
Как преобразовать NSTimeInterval
в NSDate
? Подумайте об этом, как секундомер. Я хочу, чтобы начальная дата была 00:00:00, а у меня есть NSTimeInterval
X секунд.
Мне нужно сделать это так, потому что NSTimeInterval
нужно преобразовать в int с помощью lround
для округления, затем преобразовать в NSDate
, чтобы использовать NSDateFormatter
, чтобы выбросить его в строку,
Ответы
Ответ 1
An NSTimeInterval
, как следует из его имени, um, не представляет собой то же, что и NSDate
. NSDate
- момент времени. Временной интервал - это протяженность времени. Чтобы получить точку от интервала, у вас должен быть другой момент. Ваш вопрос походит на вопрос "Как мне преобразовать 12 дюймов в пятно на этой доске, которую я режу?" Ну, 12 дюймов, начиная с того места?
Вам нужно выбрать контрольную дату. Скорее всего, это будет NSDate
, представляющее время начала вашего счетчика. Затем вы можете использовать +[NSDate dateWithTimeInterval:sinceDate:]
или -[NSDate dateByAddingTimeInterval:]
Тем не менее, я уверен, что вы думаете об этом назад. Вы пытаетесь отобразить время, прошедшее с некоторой начальной точки, т.е. Интервала, а не текущего времени. Каждый раз, когда вы обновляете дисплей, вы должны просто использовать новый интервал. Например (если у вас есть таймер, стреляющий периодически, чтобы сделать обновление):
- (void) updateElapsedTimeDisplay: (NSTimer *)tim {
// You could also have stored the start time using
// CFAbsoluteTimeGetCurrent()
NSTimeInterval elapsedTime = [startDate timeIntervalSinceNow];
// Divide the interval by 3600 and keep the quotient and remainder
div_t h = div(elapsedTime, 3600);
int hours = h.quot;
// Divide the remainder by 60; the quotient is minutes, the remainder
// is seconds.
div_t m = div(h.rem, 60);
int minutes = m.quot;
int seconds = m.rem;
// If you want to get the individual digits of the units, use div again
// with a divisor of 10.
NSLog(@"%d:%d:%d", hours, minutes, seconds);
}
Ответ 2
Здесь показано простое преобразование из и обратно:
NSDate * now = [NSDate date];
NSTimeInterval tiNow = [now timeIntervalSinceReferenceDate];
NSDate * newNow = [NSDate dateWithTimeIntervalSinceReferenceDate:tiNow];
Оле К Хорннес
Ответ 3
Я бы посоветовал использовать NSDateFormatter
, если вы хотите отображать временные интервалы. NSDateFormatter
полезен, когда вы хотите отображать время в локальном или конкретном часовом поясе. Но в этом случае было бы ошибкой, если бы время было отрегулировано часовым поясом (например, один день в году - 23 часа).
NSTimeInterval time = ...;
NSString *string = [NSString stringWithFormat:@"%02li:%02li:%02li",
lround(floor(time / 3600.)) % 100,
lround(floor(time / 60.)) % 60,
lround(floor(time)) % 60];
Ответ 4
Если у вас есть начальная дата, хранящаяся в объекте NSDate
, вы можете получить новую дату в любом интервале в будущем. Просто используйте dateByAddingTimeInterval:
следующим образом:
NSDate * originalDate = [NSDate date];
NSTimeInterval interval = 1;
NSDate * futureDate = [originalDate dateByAddingTimeInterval:interval];
Ответ 5
Через разработчики Apple:
//1408709486 - значение интервала времени
NSDate *lastUpdate = [[NSDate alloc] initWithTimeIntervalSince1970:1408709486];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
NSLog(@"date time: %@", [dateFormatter stringFromDate:lastUpdate]);
Вы получите:
дата: 22 августа 2014, 15:11:26
Ответ 6
Как правильно ответил Josh, если вы хотите, чтобы интервал был в формате NSDate, вы можете использовать следующий метод
+ (NSDate *) dateForHour:(int) hour andMinute: (int) minute{
NSDateComponents * components = [NSDateComponents new];
components.hour = hour;
components.minute = minute;
NSDate * retDate = [[NSCalendar currentCalendar] dateFromComponents:components];
return retDate;}
Ответ 7
NSTimeInterval
в NSDate
конверсия в Swift:
let timeInterval = NSDate.timeIntervalSinceReferenceDate() // this is the time interval
NSDate(timeIntervalSinceReferenceDate: timeInterval)