我不确定这是怎么回事。我正在尝试从文件加载 NSString* 对象,使用日期格式化程序将其转换为 NSDate*,然后将小时和分钟组件转换回 NSString,以便我可以在 Interface Builder 中显示时间。然而,我最终得到的不是保存到文件中的时间,而是 19 表示小时,0 表示分钟。 (无论放入什么内容,程序都会加载四个不同的 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 和 分钟Field1 是接收值的 IBOutlet)
我不确定我哪里出了问题,任何帮助将不胜感激。谢谢!
更新: 根据这里一些人的建议,我已经 NSLogged 问题,并且发现日期格式化程序不起作用。示例日期是 2011-02-14 06:00:00 GMT,日期格式化程序是 yyyy-MM-dd hh:mm:ss a,所以我不确定为什么它不起作用。
最佳答案
如果 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
关于objective-c - NSDate 无法正确加载/显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996803/