代码之家  ›  专栏  ›  技术社区  ›  Benny

uidatepicker奇怪的行为-未设置日期和选择了错误的日期

  •  1
  • Benny  · 技术社区  · 14 年前

    我和UIDatePicker有一些奇怪的问题。我在论坛上查了一下,没有找到任何答案。

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

    我保存此日期,以便下次用户进入此视图时,应自动将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 回复  |  直到 14 年前
        1
  •  1
  •   Mike Weller    14 年前

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

    我看你没问题 setDate:animated: 所以我会确保 self.appDelegate self.datePicker 实际上在那条线上是非零的。

        2
  •  2
  •   Community CDub    7 年前

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

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

    datePicker.timeZone = [NSTimeZone localTimeZone];
    

    this answer this one 更多细节。。

        3
  •  0
  •   Sandeep Yadav    7 年前

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

    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
    

    }