NSDate не будет загружаться / отображаться правильно - PullRequest
1 голос
/ 14 февраля 2011

Я не уверен, что происходит с этим.Я пытаюсь загрузить объект NSString * из файла, преобразовать его в NSDate * с помощью средства форматирования даты, а затем преобразовать компоненты часов и минут обратно в NSString, чтобы я мог отображать время в Интерфейсном Разработчике.Однако вместо времени, которое было сохранено в файл, вместо этого я получаю 19 для часа и 0 для минуты.(Независимо от того, что было вставлено, программа загружает четыре разных NSDates)

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

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd hh:mm:ss a"];
date1 = [[df dateFromString:[loadArray objectAtIndex:3]] retain];

Вот код для отображения даты.

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comp = [[gregorian components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:myDrug.date1] retain];
hourField1.text = [NSString stringWithFormat:@"%d", comp.hour];
minuteField1.text = [NSString stringWithFormat:@"%d", comp.minute];

(hourField1 и minuteField1 - это IBOutlets, которые, кстати, получают значения)

Я не уверен, где я ошибся, и любая помощь будет принята с благодарностью.Спасибо!

Обновление: по предложению некоторых из присутствовавших здесь людей я обнаружил проблему и обнаружил, что она не работает.Пример даты: 2011-02-14 06:00:00 по Гринвичу. Форматирование даты: гггг-мм-дд чч: мм: сс а, поэтому я не уверен, почему это не сработает.

1 Ответ

1 голос
/ 15 февраля 2011

Если строки даты в loadArray имеют форму 2011-02-14 06:00:00 GMT, то формат должен быть установлен следующим образом:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss zzz"];                     <--
date1 = [[df dateFromString:[loadArray objectAtIndex:3]] retain];
    // the retain above is suspicious btw (but that's another question)
[df release];  //don't forget this

Я также изменил hh на HH, предполагая, что часы на самом деле в 24-часовом формате вместо 12-часового. Подробнее см. Шаблоны формата даты Unicode .

Далее, при отображении даты, если вы хотите показывать часы и минуты по Гринвичу вместо текущего часового пояса пользователя, вам необходимо установить часовой пояс календаря:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"GMT"];             <--
[gregorian setTimeZone:tz];                                        <--
NSDateComponents *comp = [gregorian components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:myDrug.date1];
  //do not do a retain on comp above
hourField1.text = [NSString stringWithFormat:@"%d", comp.hour];
minuteField1.text = [NSString stringWithFormat:@"%d", comp.minute];
[gregorian release];  //don't forget this
...