2013-11-01 54 views
0

我已經看過相關的問題與答案,他們的解決方案沒有奏效。我真的很困惑我從NSDateComponents和NSDateFormatter(和MTDates易於使用,但我試圖繞過,得到不同的結果無濟於事)的輸出。NSDateComponents(通過MTDates)返回一個奇怪的數字小時(mt_hourOfDay)

這裏是UI的相關部分的鏈接(來自模擬器):與問題相關的http://grab.by/rFbQ

和日誌功能:

2013-10-31 23:58:03.407 Application[22530:70b] Date 2013-11-01 04:58:03 +0000 
2013-10-31 23:58:03.408 Application[22530:70b] Formatted Date Oct 31, 2013, 11:58:03 PM 
2013-10-31 23:58:03.408 Application[22530:70b] Hours 17 
2013-10-31 23:58:03.408 Application[22530:70b] Minutes 9 

代碼用於獲取的數字:

[NSDate mt_setTimeZone:[NSTimeZone localTimeZone]]; 
NSDate *current = [NSDate date]; 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateStyle:NSDateFormatterMediumStyle]; 
[formatter setTimeStyle:NSDateFormatterMediumStyle]; 
[formatter setTimeZone:[NSTimeZone localTimeZone]]; 

NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
[cal setTimeZone:[NSTimeZone localTimeZone]]; 
NSDateComponents *comp = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:current]; 

NSUInteger hours = comp.hour; 
NSUInteger minutes = ceil([current mt_minuteOfHour]/6); 

NSLog(@"Date %@", current); 
NSLog(@"Formatted Date %@", [formatter stringFromDate:current]); 
NSLog(@"Hours %lx", hours); 
NSLog(@"Minutes %lx", minutes); 

self.dateLabel.text = [formatter stringFromDate:current]; 
self.timeLabel.text = [NSString stringWithFormat:@"%lx.%lx", hours, minutes]; 

我不知道你是否可以從上面的輸出中得知,但格式化的日期(對於正確的時區)將小時顯示爲「11」(「11:58:03」),這讓我感到困惑,e ven將NSCalendarNSDateFormatter的時區設置爲相同的NSTimeZonelocalTimeZone)我得到「17」作爲當前小時。

我還應該提一下,我使用MTDates來增加日期操作,但在包含此庫之前遇到此問題(希望它的包含可能以某種方式使這些結果更加理智)。也就是說,我也嘗試更換我取自己的零件的部分:

NSUInteger hours = [current mt_hourOfDay]; 

不幸的是,這也返回「17」。我希望它會返回「23」,但會對「11」感到滿意,然後可能會將其轉換爲24比例。

+1

'%x'格式說明符用於十六進制。使用'%d'作爲十進制(Base 10)。 23十進制是17十六進制。 – rmaddy

+0

@maddy哇...我現在覺得自己像個白癡麼?我對格式化組件的不熟悉以及文檔中缺少規範(文檔中的'NSUInteger%lu或%lx')導致我盲目。這個想法從來沒有發生過。如果你不介意在回答中寫出這些(我意識到這並不多),我會給你接受。這是我的問題的解決方案。 –

+1

有時候是小事。 :)看到我的答案。 – rmaddy

回答

1

您正在使用格式說明符%lx將格式化爲十六進制值的數字。你想要%ld得到十進制(基數爲10)。

有關基本格式說明符,請參閱String Programming Guide

有關printf樣式格式說明符的完整列表,請參閱IEEE spec。 Objective-C使用此規範並添加了對象的%@

+0

我在發表我的初步評論後意識到,他們包含在文檔中,十六進制中的'%x'和'%X'格式是我完全忽略的,並且應該應用於'%lx'謝謝您指出。 –