Iphone uidatepicker异常行为-未设置日期,选择的日期错误

Iphone uidatepicker异常行为-未设置日期,选择的日期错误,iphone,date,uidatepicker,Iphone,Date,Uidatepicker,我和UIDatePicker有一些奇怪的问题。我查看了论坛,但没有找到答案 比如说,我选择了一个日期,2010年11月20日,地点在澳大利亚。当我记录它时,日期属性是2010-11-19 13:00:00+0000。但当我格式化它并在标签中显示时,它看起来是正确的,即2010年11月20日 我保存此日期,以便用户下次进入此视图时,uiDatePicker应自动设置为上次选择的日期。但它只是没有发生,它仍然显示当前日期 我已经在下面列出了重要的代码,任何建议都将不胜感激:) 当手机时区被设置时,苹

我和UIDatePicker有一些奇怪的问题。我查看了论坛,但没有找到答案

比如说,我选择了一个日期,2010年11月20日,地点在澳大利亚。当我记录它时,日期属性是2010-11-19 13:00:00+0000。但当我格式化它并在标签中显示时,它看起来是正确的,即2010年11月20日

我保存此日期,以便用户下次进入此视图时,uiDatePicker应自动设置为上次选择的日期。但它只是没有发生,它仍然显示当前日期

我已经在下面列出了重要的代码,任何建议都将不胜感激:)


当手机时区被设置时,苹果的日期时间选择器中有一个错误。自从这款手机发布以来,它已经出现在了所有版本中,在我居住的地方(新西兰的格林尼治标准时间为+12/+13,这似乎放大了问题),它让我感到非常痛苦。您可以在输入日期/时间的任何位置重现问题,例如iphone的联系人生日字段

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

datePicker.timeZone = [NSTimeZone localTimeZone];

有关更多详细信息,请参见或。

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


我认为您的
setDate:animated:
行没有问题,因此我会确保
self.appDelegate
self.datePicker
在该行上方实际上不为零。

使用此方法获取正确的日期:

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

}

这不是足够的代码。您必须在保存时显示保存此时间的代码和日期格式。删除lastDatePicked属性。嘿,迈克,谢谢你解释格式问题。我以为这是一个错误,但现在它有了完美的意义!appDelegate和datePicker并非如您所建议的那样为零。在这个问题上被难住了:(谢谢你的建议。
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