2011-12-02 37 views
5

我使用的UIDatePicker當我採取選擇與日期:的UIDatePicker我的應用程序返回錯誤的NSDate

NSDate *date = picker.date; 

picker.date返回的一天,我選擇了日期之前。

任何想法爲什麼會發生?

+0

是否使用了UIImagePicker(如你的問題),或者一個的UIDatePicker(如你的問題標題)?你是否以任何方式定製日期選擇器? –

+0

我的錯,我使用的UIDatePicker – MTA

回答

8

UIDatePicker將在您的本地時區顯示日期和時間。但是,NSDate沒有任何時區的概念,因爲它存儲自參考日期以來的絕對秒數。當NSLogging是日期時,它以GMT顯示日期和時間。我期望如果你計算出與GMT的本地時區差異,你會發現它是正確的日期。

嘗試使用適當的語言環境創建NSDateFormatter或NSCalendar,並通過該日期傳遞日期。

有關此常見主題的更多解讀,請參閱this site written by another SO contributor

+0

我選擇讓用戶只選擇沒有時間的日期 – MTA

+2

沒有NSDate沒有時間。你只是沒有顯示它。答案依然如此。 – jrturton

+0

這裏同樣的問題。通過將'setTimeZone:'&'setLocale:'添加到我的UIDatePicker來修復。 – HelmiB

1

你檢查了時區嗎?

當您打印一個NSDate它將使用GMT作爲它的時區。

如果設置系統時區的NSDateFormatter你可能會得到一個其他日期,因爲這將需要的時區,並相應計算時間。

添加該代碼,看看輸出是否正確:

NSDate *date = picker.date; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeZone:NSDateFormatterNoStyle]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 
NSLog(@"Date: %@", [dateFormmater stringFromDate:date]); 
[dateFormatter release], dateFormatter = nil; 
+0

所以,我怎麼能得到僅由用戶選擇 – MTA

+0

日你有時間的用戶選擇,但你沒有時區。所使用的時區是當前系統的ID。 – rckoenes

5

試試這個工作對我來說

 NSDate* sourceDate = [NSDate date]; 

     NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
     NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; 

     NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate]; 
     NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]; 
     NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset; 

     NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease]; 

//我在標籤輸出礦山你可以使用任何你喜歡

 NSString *dateOutput = [[[NSString alloc] initWithFormat:@"%@", destinationDate]autorelease]; 
     self.dateLabel.text = dateOutput; 
2

記住創建的NSDate然後輸出它帶有有效的時區和日曆!

的NSDate僅代表時間的絕對點。它沒有時區(紐約,巴塞羅那,...)或日曆(格里高利,希伯來,...)的概念。

的UIDatePicker返回默認情況下的NSDate與系統NSCalendarNSTimeZone,但是當你嘗試以後打印出來,你不格式化輸出。你可能會有不匹配的地方。

因此,您需要正確設置UIDatePicker,然後使用NSDateFormatter轉換輸出,以便它知道日曆和正在使用的時區。

用的UIDatePicker的初始化的示例代碼,然後打印結果:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // init the UIDatePicker with your values 
    // by default UIDatePicker inits with today, system calendar and timezone 
    // Only for teaching purposes I will init with default values 
    NSDate * now = [[NSDate alloc] init]; 
    [_datePicker setDate: now] 
       animated: YES];  

    _datePicker.timeZone = [NSTimeZone localTimeZone]; 
    _datePicker.calendar = [NSCalendar currentCalendar]; 

    [_datePicker addTarget: self 
        action: @selector(getDatePickerSelection:) 
     forControlEvents:UIControlEventValueChanged]; 

} 


-(void)getDatePickerSelection:(id) sender 
{ 

    // NSDateFormatter automatically inits with system calendar and timezone 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    // Setup an output style 
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

    // Medium style date, short style time => "Nov 23, 1937 3:30pm" 
    NSString *dateString = [dateFormatter stringFromDate:date]; 

} 

檢查答案我做了另一個非常類似的問題:

NSDate output using NSDateFormatter

1

只需添加一行代碼

self.datePicker.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 

0是GMT 00。根據您的時區添加。

相關問題