Я потратил пару часов, чтобы решить эту странную проблему.У меня есть формат даты в «дд / мм / гггг чч: мм: сс» и я хочу узнать разницу в секундах между датой и СЕЙЧАС.Я делаю это, как показано ниже, но не понимаю, почему он получает 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
[EDIT]
Замена "дд / мм / гггг чч: мм:сс "до" дд / мм / гггг чч: мм: сс "сработало, но разница в секундах по-прежнему не корректна.См. Следующие выходные данные для разных дат!
Исправленный код:
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);
ВЫХОД: (обратите внимание, что многие выходы - это НАН !!)
2012-02-03 11:30: 23.198 UniversalApp [13207: 707] На дату: 03.02.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.512UniversalApp [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] ToDate: 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-0311: 32: 06.643 UniversalApp [13207: 707] секунд: nan totaldays: 0
[РЕДАКТИРОВАТЬ]
Замена 'hh' на 'HH' решена выше проблемы!
[РЕДАКТИРОВАТЬ]
Другая проблема, с которой я столкнулся ... фу !!
Это не работает, если установить 24-часовое отключение!Исходя из этого , оно переопределяется настройками пользователя.
Я не смог найти надежного решения этой последней проблемы.Наконец, я решил проверить значение «nan» в секундах, и если оно равно «nan», то использовать исходную строку даты, а не конвертировать в секунды, часы и т. Д.
// Check for the 'nan', return if seconds='nan' invalid date format.
if(seconds != seconds)
return nil;
//работа