NSDate конвертирует очень странно - PullRequest
1 голос
/ 10 июня 2011

У меня есть время: 7:46 am

Я хочу преобразовать это в NSDate.Я делаю это:

NSDateFormatter *f = [NSDateFormatter new];
[f setDateFormat:@"h:mm a"];
NSDate *sr = [f dateFromString:@"7:46 am"];

Я NSLog sr, и я получаю 1969-12-31 22:46:00 +0000

Эти времена не совпадают.Почему это так запутано?

Ответы [ 3 ]

5 голосов
/ 10 июня 2011

Нет. Это не странно. NSDateConverter и NSDate просто выполняют свою намеченную работу здесь.

Вы пытаетесь конвертировать "7:46 am" в дату. Он содержит только время. Дата не указана в строке. NSDate по умолчанию будет "1970-01-01" (эпоха Unix), если дата не указана. Таким образом, после преобразования строки вы получите дату "1970-01-01 7:46 am". При попытке отобразить это в NSLog , если будет отображаться дата после настройки значения смещения timeZone. Я думаю, вы живете в Японии или Корее. Вероятно, смещение вашего региона +09: 00. Таким образом, она отображает дату, вычитая смещение. Итак, вы видите "1969-12-31 22:46:00 +0000" в журнале.

Вы можете использовать следующий метод для установки того времени на определенную дату, может быть сегодня .

NSString *timeStr = @"7:46 am";
NSDateFormatter *f = [NSDateFormatter new];
[f setDateFormat:@"yyyy-MM-dd"];
NSString *dateStr = [f stringFromDate:[NSDate date]]; // dateStr = 2011-06-10
dateStr = [dateStr stringByAppendingFormat:@" %@", timeStr]; // dateStr = 2011-06-10 7:46 am 
[f setDateFormat:@"yyyy-MM-dd h:mm a"];
NSDate *sr = [f dateFromString:dateStr];
2 голосов
/ 10 июня 2011

Вы не указываете день или часовой пояс ... предполагая, что вы хотите выразить "сегодня в 7:42", вы можете использовать этот код:

NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setHour:7];
[comps setMinute:42];
NSDate *myDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[comps release];

NSLog myDate должен дать вам ожидаемый результат сейчас (при условии, что вы хотели сегодня в 7:46).

0 голосов
/ 10 июня 2011

Поскольку вы указываете только время, на которое вы хотите, чтобы NSDate ссылался, а не дату, форматировщик использует дату по умолчанию (которая, похоже, очень близка к эпохе UNIX). Как сказал Хулио, вам также следует указать текущую дату, если вы хотите, чтобы NSDate ссылался на время на эту конкретную дату.

...