首页 文章

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

提问于
浏览
1

我对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];

3 回答

  • 2

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

    我看到你的 setDate:animated: 行没有问题,所以我要确保 self.appDelegateself.datePicker 实际上非正常位于该行之上 .

  • 1

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

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

    datePicker.timeZone = [NSTimeZone localTimeZone];
    

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

  • 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
    

    }

相关问题