uidatepicker奇怪的行为 - 没有选择日期和错误的日期

时间:2010-11-25 01:13:40

标签: iphone date uidatepicker

我在UIDatePicker上遇到了一些奇怪的问题。我检查了论坛,我对所提供的答案没有任何运气。

假设我选择了一个日期,2010年11月20日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];

3 个答案:

答案 0 :(得分:2)

设置手机时区时,苹果日期时间选择器中存在错误。自从它发布以来,它一直存在于手机的所有版本中,这对我来说真的很痛苦(新西兰的格林威治标准+ 12 / + 13,这似乎放大了问题)。您可以在输入日期/时间的任何地方重现问题,例如iphone的联系人生日字段。

我在某些地方读过这段代码有时会解决问题:

datePicker.timeZone = [NSTimeZone localTimeZone];

有关详细信息,请参阅this answerthis one

答案 1 :(得分:1)

首先,请注意2010-11-19 13:00:00 +0000是UTC格式,因此为EN_AUS格式化的日期将提前11个小时,这就是为什么在使用区域设置对其进行格式化时会看到20/11/2010的原因。所以这根本不是问题,这是正确的行为。

我认为您的setDate:animated:行没有任何问题,因此我会确保self.appDelegateself.datePicker实际上非正常位于该行之上。

答案 2 :(得分: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

}