Задача C: преобразование строки в проблему nsdate - PullRequest
1 голос
/ 03 февраля 2012

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

//работа

Ответы [ 3 ]

4 голосов
/ 03 февраля 2012

Для месяца это должно быть 'MM'.

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

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

на

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

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

[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"];
1 голос
/ 03 февраля 2012

Проверьте строку формата, вы хотите @ "дд / мм / гггг чч: мм: сс". С тем, что у вас есть, вы рассматриваете минуты как месяц.

0 голосов
/ 27 декабря 2013

Попробуйте

1002 *
...