NSDate无法正确加载/显示

时间:2011-02-14 20:15:32

标签: objective-c cocoa nsdate

我不确定这是怎么回事。我正在尝试从文件加载NSString *对象,将其转换为带有日期格式化程序的NSDate *,然后将小时和分钟组件转换回NSString,以便我可以在Interface Builder中显示时间。但是,而不是保存到文件的时间,而不是我的小时为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)

我不确定我在哪里出错,任何帮助都将不胜感激。谢谢!

更新: 根据这里的一些人的建议,我已经NSLog了这个问题,我发现它是日期格式化程序不能正常工作。示例日期是2011-02-14 06:00:00 GMT,日期格式化程序是yyyy-MM-dd hh:mm:ss a,所以我不确定它为什么不起作用。

1 个答案:

答案 0 :(得分:1)

如果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 Date Format Patterns

接下来,在显示日期时,如果您想以GMT显示小时和分钟而不是用户当前时区,则需要设置日历的时区:

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