NSTimeInterval to NSDate - PullRequest
       66

NSTimeInterval to NSDate

16 голосов
/ 01 ноября 2011

Как я могу преобразовать NSTimeInterval в NSDate? Думайте об этом как о секундомере. Я хочу, чтобы начальная дата была 00:00:00, и у меня есть NSTimeInterval из X секунд.

Мне нужно сделать это так, потому что NSTimeInterval необходимо преобразовать в целое число с помощью lround для округления, а затем преобразовать в NSDate, чтобы использовать NSDateFormatter, чтобы бросить его в строку ,

Ответы [ 7 ]

34 голосов
/ 01 ноября 2011

NSTimeInterval, как следует из его названия, не означает то же самое, что 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);
 }
15 голосов
/ 24 июля 2013

Здесь показано простое преобразование из и обратно:

 NSDate * now = [NSDate date];
 NSTimeInterval  tiNow = [now timeIntervalSinceReferenceDate]; 
 NSDate * newNow = [NSDate dateWithTimeIntervalSinceReferenceDate:tiNow];

Ole K Hornnes

12 голосов
/ 02 ноября 2011

Я бы не советовал использовать 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];
6 голосов
/ 01 ноября 2011

Если ваша начальная дата хранится в объекте NSDate, вы можете получить новую дату через любой интервал в будущем. Просто используйте dateByAddingTimeInterval: вот так:

NSDate * originalDate = [NSDate date];
NSTimeInterval interval = 1;
NSDate * futureDate = [originalDate dateByAddingTimeInterval:interval];
2 голосов
/ 22 августа 2014

Через 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

0 голосов
/ 30 декабря 2015

NSTimeInterval в NSDate преобразование в Swift:

let timeInterval = NSDate.timeIntervalSinceReferenceDate() // this is the time interval
NSDate(timeIntervalSinceReferenceDate: timeInterval)
0 голосов
/ 20 ноября 2015

Когда Джош ответит правильно, если вы хотите, чтобы интервал был в формате 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;}
...