我在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];
答案 0 :(得分:2)
设置手机时区时,苹果日期时间选择器中存在错误。自从它发布以来,它一直存在于手机的所有版本中,这对我来说真的很痛苦(新西兰的格林威治标准+ 12 / + 13,这似乎放大了问题)。您可以在输入日期/时间的任何地方重现问题,例如iphone的联系人生日字段。
我在某些地方读过这段代码有时会解决问题:
datePicker.timeZone = [NSTimeZone localTimeZone];
有关详细信息,请参阅this answer或this one。
答案 1 :(得分:1)
首先,请注意2010-11-19 13:00:00 +0000
是UTC格式,因此为EN_AUS格式化的日期将提前11个小时,这就是为什么在使用区域设置对其进行格式化时会看到20/11/2010
的原因。所以这根本不是问题,这是正确的行为。
我认为您的setDate:animated:
行没有任何问题,因此我会确保self.appDelegate
和self.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
}