2011-02-14 137 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