2010-11-25 29 views
1

我有一些與UIDatePicker奇怪的問題。我檢查了論壇,並且沒有提供任何答案。uidatepicker奇怪的行爲 - 沒有設置日期和錯誤的日期被選中

說我選擇日期,20/11/2010 EN_AUS語言環境。當我NSLog日期屬性是2010-11-19 13:00:00 +0000。但是,當我將其格式化並顯示在標籤中時,它看起來是正確的,即20/11/2010?!

我保存這個日期,以便下次用戶進入這個視圖時,uiDatePicker應該自動設置在最後選擇的日期。但它沒有發生,它仍然顯示當前日期。

我在下面列出的重要代碼,任何建議表示讚賞:)

// setting up the uiDatePicker 
NSLocale *ozLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_AUS"]; 
self.datePicker.calendar = [NSCalendar autoupdatingCurrentCalendar]; 
[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:39600]]; // Melbourne time zone 
[self.datePicker setLocale:ozLocale]; 
self.datePicker.timeZone = [NSTimeZone localTimeZone]; 
[ozLocale release]; 

// displaying the date from the uidatePicker 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
self.dateLabel.text = [dateFormatter stringFromDate:self.datePicker.date]; 
[dateFormatter release]; 


// In viewWillAppear I set the uiDatePicker. lastDatePicked has the value of 2010-11-19 13:00:00 +0000 at this point 
[self.datePicker setDate:self.appDelegate.lastDatePicked animated:FALSE]; 
+0

這是不夠的code.You必須證明代碼,你救救在這段時間和日期的格式。 decdration lastDatePicked屬性。 – Ishu 2010-11-25 05:40:49

回答

1

首先,注意2010-11-19 13:00:00 +0000是UTC,所以格式化爲EN_AUS的日期將提前11個小時,這就是爲什麼您在使用語言環境格式化時看到20/11/2010的原因。所以這根本不是問題,這是正確的行爲。

我沒有看到你的setDate:animated:行沒有問題,所以我會確保self.appDelegateself.datePicker實際上非零,只是在該行的上方。

+0

嘿邁克,感謝您解釋格式問題。我認爲這是一個錯誤,但現在它變得非常有意義! appDelegate和datePicker不是你所建議的。難住這一個:(謝謝你的建議,但。 – bennythemink 2010-11-28 02:28:11

1

有在蘋果的日期時間選擇器中的錯誤,當手機的時區已設置。自從它發佈以來,它一直在所有版本的手機中使用,這對我住在哪裏的我來說真的很痛苦(新西蘭的格林尼治標準時間爲+ 12/+ 13,這似乎會放大這個問題)。您可以在輸入日期/時間的任何地方重現問題,例如iphone的聯繫人生日字段。

我讀過,有些地方是這段代碼有時能解決問題:

datePicker.timeZone = [NSTimeZone localTimeZone]; 

this answerthis one瞭解更多詳情..

+0

感謝您的信息謝恩 – bennythemink 2010-11-28 02:25:44

0

使用這種方法來獲得正確的日期:

func getDateStamp(date:String)-> String{ 

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss +SSSS" 
dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 

guard let date = dateFormatter.date(from: date) else { 
    // assert(false, "no date from string") 
    return "" 
} 

dateFormatter.dateFormat = "dd MMMM,yyyy" //"yyyy-MM-dd" 
dateFormatter.timeZone = TimeZone.current 

let st = dateFormatter.string(from: date) 

return st 

}