2010-01-25 120 views
2

我在寫一些代碼來獲取服務器上的圖像。圖像文件名採用yyyyMMdd_HHmm格式(採用UTC),每3小時生成一次(1200,1500,1800等..)。當代碼開始時,我得到當前UTC日期並提取時間。然後我從中創建一個NSDateComponent,並查看當前時間,將NSDateComponent的小時設置爲下一個圖像的小時。很奇怪的是,如果我的時間設置爲3,NSDate的我從NSCalendar dateFromComponents背面擁有一顆不同小時 ...怎麼辦? (我也在控制檯輸出中添加了)。NSDateComponents返回奇怪的小時

// get current time in UTC 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSTimeZone *UTC = [NSTimeZone timeZoneWithName:@"UTC"]; 
[dateFormatter setTimeZone:UTC]; 

// get the current hour & min 
[dateFormatter setDateFormat:@"HHmm"]; 
NSDate *today = [NSDate date]; 
NSString *str = [dateFormatter stringFromDate:today]; 
NSInteger hour = [str integerValue]; 
NSLog(str); 

// find next image hour 
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; 
NSDateComponents *currentImageDateComps = [cal components:unitFlags fromDate:today]; 

if (hour > 2100) { 
    [currentImageDateComps setHour:0]; 
    // add an extra day as next image is start of new day 
    [currentImageDateComps setDay:[currentImageDateComps day]+1]; 

} else if (hour < 300) { 
    [currentImageDateComps setHour:3]; 
} else if (hour < 600) { 
    [currentImageDateComps setHour:6]; 
} else if (hour < 900) { 
    [currentImageDateComps setHour:9]; 
} else if (hour < 1200) { 
    [currentImageDateComps setHour:12]; 
} else if (hour < 1500) { 
    [currentImageDateComps setHour:15]; 
} else if (hour < 1800) { 
    [currentImageDateComps setHour:18]; 
} else if (hour < 2100) { 
    [currentImageDateComps setHour:21]; 
} 
[currentImageDateComps setMinute:0]; 


NSLog(@"hour %d", [currentImageDateComps hour]); 
NSLog(@"minute %d", [currentImageDateComps minute]); 
// construct the date 
NSDate *currentImageDate = [cal dateFromComponents:currentImageDateComps]; 
[dateFormatter setDateFormat:@"yyyyMMdd_hhmm"]; 
NSString *nextImage = [dateFormatter stringFromDate:currentImageDate]; 

self.currentFilename = [nextImage stringByAppendingString:@".png"]; 
NSLog(self.currentFilename); 

從NSLog生成的控制檯輸出是這樣的。我得到的值爲3小時,但它返回爲'1700'?

2010-01-25 12:25:02.049預測[8447:207] viewDidLoad中

2010-01-25 12:25:02.052預測[8447:207] 0225

2010-01- 25 12:25:02.052預測[8447:207]每小時3

2010-01-25 12:25:02.053預測[8447:207]分鐘0

2010-01-25 12:25:02.053預測[8447:207] 20100124_1700.png

(I 「M意識到有一些內存釋放問題,但我想它的功能第一..)

回答

6

時區問題可能嗎?

+0

是的,看來這是問題我猜,當你創建一個NSCalendar它使用你的。 。默認的時區我NSDateFormatter了時區設置爲UTC但是從NSCalendar得到的NSDateComponents沒了,所以區別我已經 補充道:創建NSCalendar對象之後[CAL setTimeZone UTC]和我所有的日期/時間,現在是什麼我會期待。 – timbo 2010-01-25 05:44:24

1

出了什麼問題:

NSString *nextImage = [NSString stringWithFormat:@"%04d%02d%02d_%02d%02d.png", [currentImageDateComps year], [currentImageDateComps month], [currentImageDateComps day], [currentImageDateComps hour], [currentImageDateComps minute]];

self.currentFilename = nextImage;

+0

是的,它的工作原理*,你可以絕對確保沒有PARMS的是一個有效的時間範圍之外*。事實上,因爲self.currentFilename是一個NSString,我可以簡單地使用'self.currentFilename = [NSString stringWithFormat:@「....但是如果你想生成日期,比如循環和增加小時數,你會得到無效的日期。在這種情況下,[CAL dateFromComponents:..]將產生有效的日期....給你的時區是確定:-) – timbo 2010-01-25 09:28:58