Как я ломаю NSTimeInterval в год, месяцы, дни, часы, минуты и секунды на iPhone?

Существует университетский курс в Индиане и Университетах Пердью на C-программировании. Курс имеет видео лекции, которые можно найти в здесь .

, Если Вы также интересуетесь рассмотрением C++, существует набор лекций в веб-Проект Архива Лекции, названный "C++ для Физиков Частицы". Вы находите те лекции здесь . Лекции сохранены Paul Kunz из Стэнфордского университета.

Для большего количества лекций C++, можно также проверить , эти лекции от Повторно подключают Сети.

55
задан Peter Hosey 2 February 2010 в 03:13
поделиться

5 ответов

Краткое описание

  1. Еще один подход к завершению ответа JBRWilkinson, но с добавлением кода. Он также может предложить решение комментария Алекса Рейнольдса.

  2. Использовать метод NSCalendar:

    • (NSDateComponents *) components: (NSUInteger) unitFlags fromDate: (NSDate *) startDate toDate: (NSDate *) Параметры resultDate: (NSUInteger) opts

    • "Возвращает, как объект NSDateComponents используя указанные компоненты, разница между двумя предоставленными датами ". (Из документации API).

  3. Создайте 2 NSDate, разница между которыми состоит в NSTimeInterval, который вы хотите разбить. (Если ваш NSTimeInterval получен из сравнения 2 NSDate, вам не нужно делать этот шаг, и вам даже не нужен NSTimeInterval, просто примените даты к методу NSCalendar).

  4. Получите цитаты из NSDateComponents

Образец кода

// The time interval 
NSTimeInterval theTimeInterval = ...;

// Get the system calendar
NSCalendar *sysCalendar = [NSCalendar currentCalendar];

// Create the NSDates
NSDate *date1 = [[NSDate alloc] init];
NSDate *date2 = [[NSDate alloc] initWithTimeInterval:theTimeInterval sinceDate:date1]; 

// Get conversion to months, days, hours, minutes
NSCalendarUnit unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit;

NSDateComponents *breakdownInfo = [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];
NSLog(@"Break down: %i min : %i hours : %i days : %i months", [breakdownInfo minute], [breakdownInfo hour], [breakdownInfo day], [breakdownInfo month]);
100
ответ дан 26 November 2019 в 17:47
поделиться

Преобразуйте ваш интервал в NSDate , используя + dateWithIntervalSince1970 , получите компоненты даты из этого, используя NSCalendar -componentsFromDate .

Ссылка на SDK

4
ответ дан 26 November 2019 в 17:47
поделиться
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];

// format: YYYY-MM-DD HH:MM:SS ±HHMM
NSString *dateStr = [date description];
NSRange range;

// year
range.location = 0;
range.length = 4;
NSString *yearStr = [dateStr substringWithRange:range];
int year = [yearStr intValue] - 1970;

// month
range.location = 5;
range.length = 2;
NSString *monthStr = [dateStr substringWithRange:range];
int month = [monthStr intValue];

// day, etc.
...
2
ответ дан 26 November 2019 в 17:47
поделиться

Вот еще одна возможность, несколько чище:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
NSString *dateStr = [date description];
const char *dateStrPtr = [dateStr UTF8String];

// format: YYYY-MM-DD HH:MM:SS ±HHMM
int year, month, day, hour, minutes, seconds;
sscanf(dateStrPtr, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minutes, &seconds);
year -= 1970;
-1
ответ дан 26 November 2019 в 17:47
поделиться

Это работает для меня:

    float *lenghInSeconds = 2345.234513;
    NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:lenghInSeconds];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];


    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

    [formatter setDateFormat:@"HH:mm:ss"];
    NSLog(@"%@", [formatter stringFromDate:date]); 
    [formatter release];

Основное отличие здесь в том, что вам нужно настроить часовой пояс.

3
ответ дан 26 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: