Цель C: преобразование строки в задачу nsdate

Я потратил пару часов, чтобы решить эту странную проблему. У меня формат даты в формате «дд / мм / гггг чч: мм: сс», и я хочу узнать разницу в секундах между моей датой и СЕЙЧАС. Я делаю это, как показано ниже, но не понимаю, почему 31 день работает неправильно? Разница должна составлять всего несколько часов! Может ли кто-нибудь помочь мне, что я здесь делаю не так?

NSString* datetime = @"03/02/2012 10:25:34"; // Today's date
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"dd/mm/yyyy hh:mm:ss"];
NSDate *dateFromString = [dateFormatter dateFromString:datetime];

NSTimeInterval diffSeconds = [[NSDate date] timeIntervalSinceDate:dateFromString];
int totalDays = diffSeconds/(24*60*60);

NSLog(@"seconds:%f totaldays:%d",diffSeconds, totalDays);

ВЫХОД:

2012-02-03 10:50:50.480 UniversalApp[13114:707] diff:2679916.480563 totaldays:31

Затем я снова попытался преобразовать dateFromString в NSDate и удивился, что он напечатал совершенно случайную дату. Не знаете, как это возможно? Это должно дать мою исходную дату "datetime"!

NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"dd/mm/yyyy hh:mm:ss"];
NSString* str = [formatter stringFromDate:dateFromString];
NSLog(@"date:%@ to date:%@", datetime, str);

ВЫХОД:

date:03/02/2012 10:25:34 to date:03/25/2012 10:25:34

[РЕДАКТИРОВАТЬ]

Замена «дд / мм / гггг чч: мм: сс» на «дд / ММ / гггг чч: мм: сс» сработала, но разница в секундах все равно не подходит. Смотрите следующие результаты для разных дат!

Исправленный код:

NSLog(@"For Date:%@",[res objectForKey:@"CommentDate"]);
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"dd/MM/yyyy hh:mm:ss"];
NSDate *dateFromString = [dateFormatter dateFromString:[res objectForKey:@"CommentDate"]];

NSTimeInterval diffSeconds = [[NSDate date] timeIntervalSinceDate:dateFromString];
int totalDays = diffSeconds/(24*60*60);

NSLog(@"seconds:%f totaldays:%d",diffSeconds, totalDays);

ВЫХОД: (обратите внимание, что многие выходы - это Nan !!)

2012-02-03 11:30: 23.198 UniversalApp [13207: 707] На дату: 02.03.2012 10:25:34

2012-02-03 11: 30: 23.204 UniversalApp [13207: 707] секунд: 3889.204166 всего дней: 0

2012-02-03 11:30: 23,506 UniversalApp [13207: 707] Для даты: 02.02.2012 16:56:05

2012-02-03 11: 30: 23.512 UniversalApp [13207: 707] секунд: нан всего дней: 0

2012-02-03 11:30: 23.818 UniversalApp [13207: 707] На дату: 02.02.2012 14:34:05

2012-02-03 11: 30: 23.827 UniversalApp [13207: 707] секунд: нан всего дней: 0

2012-02-03 11: 31: 25.253 UniversalApp [13207: 707] Дата: 02.02.2012 12:02:55

2012-02-03 11: 31: 25.255 UniversalApp [13207: 707] секунд: 127710.255748 всего дней: 1

2012-02-03 11: 32: 06.424 UniversalApp [13207: 707] Для даты: 01.02.2012 11:01:20

2012-02-03 11:32: 06.427 UniversalApp [13207: 707] секунд: 174646.427676 всего дней: 2

2012-02-03 11: 32: 06.639 UniversalApp [13207: 707] На дату: 31.01.2012 17:38:17

2012-02-03 11: 32: 06.643 UniversalApp [13207: 707] секунд: нан всего дней: 0

[РЕДАКТИРОВАТЬ]

Замена "чч" на "чч" решила вышеуказанную проблему!

[РЕДАКТИРОВАТЬ]

Еще одна проблема, с которой я столкнулся ... уф !!

Это не сработает, если выключить часы на 24 часа! Основываясь на this, он отменяет настройки пользователя.

Я не смог найти сильного решения этой последней проблемы. Наконец, я решил проверить значение 'nan' в течение секунд, и если это 'nan', тогда используйте исходную строку даты и не конвертируйте в секунды, часы и т. Д.

// Check for the 'nan', return if seconds='nan' invalid date format.
if(seconds != seconds)
    return nil;

// Приступаем к работе


person AlienMonkeyCoder    schedule 03.02.2012    source источник


Ответы (3)


Для месяца это должно быть «ММ».

Измените следующую строку

[dateFormatter setDateFormat:@"dd/mm/yyyy hh:mm:ss"];

to

[dateFormatter setDateFormat:@"dd/MM/yyyy hh:mm:ss"];

Изменить. Извините, формат должен быть

[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"];
person Ilanchezhian    schedule 03.02.2012
comment
OMG, не могу поверить, что я потратил на это утро! Спасибо. - person AlienMonkeyCoder; 03.02.2012
comment
по-прежнему есть некоторые проблемы с подсчетом секунд. См. Отредактированный вопрос. Спасибо. - person AlienMonkeyCoder; 03.02.2012
comment
Может быть, я использовал 24 часа времени, а он ожидает 12 часов? Как указать разрешить 24 часа? Спасибо. - person AlienMonkeyCoder; 03.02.2012
comment
Да, даже я тоже только что заметил - person Ilanchezhian; 03.02.2012
comment
все еще есть проблема ... это не работает, если выключить часы на 24 часа! На основании этого - stackoverflow.com/questions/2135267/, он переопределяется настройками пользователя .. Сначала мне нужно будет проверить, какие настройки установлены пользователем. Отредактирую, как только закончу. Дайте мне знать, если у вас есть возможность проверить настройки часов пользователя. Спасибо. - person AlienMonkeyCoder; 03.02.2012
comment
Привет, Адхира: этот вопрос кажется немного сложным! У меня есть формат даты в 24 часа, исходящий с сервера, поэтому независимо от локальных настроек пользователя iPhone мне нужно, чтобы пользователь отображал 24 часа для расчета секунд. В настоящее время он возвращает «nan», когда у пользователя отключены часы на 24 часа! Не знаю, как мне с этим справиться! - person AlienMonkeyCoder; 03.02.2012
comment
Выложил моё слабое решение. Я не думаю, что есть способ удовлетворить мои требования! - person AlienMonkeyCoder; 03.02.2012

Проверьте строку формата, вы хотите @ "dd / MM / yyyy hh: mm: ss". С тем, что у вас есть, вы относитесь к минутам как к месяцу.

person David Knight    schedule 03.02.2012

Попробуй это

        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"dd-MM-yyyy HH:mm:ss"];

        NSDate *date = [df dateFromString:@"12-12-2013 15:50:50"];

         NSLog(@"Converted Date-->%@",date);

        NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
        [dateComponents1 setDay:6];

        NSDate *afterSomeDays = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents1 toDate:date options:0];

        NSLog(@"afterfifteenDays: %@", afterSomeDays);
person Mritunjay    schedule 27.12.2013