【问题标题】:uidatepicker strange behaviour - not setting date and wrong date being selecteduidatepicker 奇怪的行为 - 没有设置日期和错误的日期被选择
【发布时间】:2026-02-20 15:45:01
【问题描述】:

我在使用 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];

【问题讨论】:

  • 这不是足够的代码。您必须在保存期间显示您保存此时间的代码和日期格式。 lastDatePicked 属性的声明。

标签: iphone date uidatepicker


【解决方案1】:

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

我在某些地方读到这段代码有时可以解决问题:

datePicker.timeZone = [NSTimeZone localTimeZone];

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 嗨,迈克,感谢您解释格式问题。我认为这是一个错误,但现在它完全有道理! appDelegate 和 datePicker 不是你建议的 nil 。难倒这个:(不过谢谢你的建议。
    【解决方案3】:

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

    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
    

    }

    【讨论】: