2011-02-14 58 views
1

我不确定这是怎么回事。我试图从文件中加载NSString *对象,将它转换为带日期格式化程序的NSDate *,然后将小时和分钟组件转换回NSString,以便在Interface Builder中显示时间。但是,而不是保存到文件中的时间,而是最终以每小时19分钟和每分钟0分钟为结束。 (不管放入什么,程序加载四个不同的NSDates)NSDate不会正确加载/显示

下面是从文件中加载日期的代码(我用断点检查,并且数组确实有正确的数据,所以这不是问题)

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)

我不知道,我已经走了错在这里,任何帮助,将不胜感激。谢谢!

更新: 在这里的一些人的建议,我NSLogged的问题,我发现它的日期格式化程序不工作。例如,日期格式为2011-02-14 06:00:00 GMT,日期格式化程序为yyyy-MM-dd hh:mm:ss a,所以我不确定它为什么不起作用。

+0

如何你填写`loadArray`? – vikingosegundo 2011-02-14 20:38:23

+0

直接从一个文件,它是[NSMutableArray arrayWithContentsOfFile:[self saveFilePath]] – Nicholas1024 2011-02-14 20:44:00

回答

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 

我也改变了hhHH假定小时实际上是24小时,而不是12小时制。详情请参阅Unicode Date Format Patterns

接下来,显示日期的时候,如果你想显示在格林尼治标准时间的小时和分钟,而不是任何用户的当前时区,你需要设置日历的时区:

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