Я потратил пару часов, чтобы решить эту странную проблему. У меня формат даты в формате «дд / мм / гггг чч: мм: сс», и я хочу узнать разницу в секундах между моей датой и СЕЙЧАС. Я делаю это, как показано ниже, но не понимаю, почему 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;
// Приступаем к работе