【问题标题】:date and time separately , a day behind?日期和时间分别,晚了一天?
【发布时间】:2018-09-24 17:56:42
【问题描述】:

我正在尝试以 12 小时格式在我的应用中实现日期和时间单独选择。但由于某种原因,我无法在初始选择后选择当前日期,即我在开始时设置当前日期,标签分别包含时间和日期。最初设置的当前日期和时间是正确的,但后来当我将日期更改为上一个日期并在此之后选择当前日期时,即使设置了当前语言环境,格式化的日期也会晚一天。

日期和时间最初是这样设置的:

func setDateandTime() -> SubmitReportDate{

    let cell = tableView.dequeueReusableCell(withIdentifier: "submitReportDate") as! SubmitReportDate
    let dateFormatter : DateFormatter = DateFormatter()
    dateFormatter.locale = NSLocale.current
    dateFormatter.dateFormat = "MM-dd-yyyy"
    let date = Date()
    if(userInstance.userData?.Date != nil){
        self.date = (userInstance.userData?.Date)!
    }else{
        self.date = dateFormatter.string(from: date)
    }
    cell.dateLabel.setTitle(self.date, for: .normal)
    let timeFormatter : DateFormatter = DateFormatter()
    timeFormatter.locale = NSLocale.current
    timeFormatter.dateFormat = "hh:mm a"
    timeFormatter.amSymbol = "AM"
    timeFormatter.pmSymbol = "PM"
    if(userInstance.userData?.Time != nil){
        self.time = (userInstance.userData?.Time)!
    }else{
        self.time = timeFormatter.string(from: date)
    }
    cell.timeLabel.setTitle(self.time, for: .normal)
    cell.dateLabel.addTarget(self, action: #selector(dateChanged(sender:)), for: .touchUpInside)
    cell.timeLabel.addTarget(self, action: #selector(timeChanged(sender:)), for: .touchUpInside)
    return cell

}

此处格式化后的日期和时间正确显示。 然后更改日期这个函数就是我使用的。

@objc func dateChanged(sender: UIButton){

    let alert = UIAlertController(style: .actionSheet, title: "Select date")
    alert.addDatePicker(mode: .date, date: Date(), minimumDate: nil , maximumDate: Date()) { date in
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MM-dd-yyyy"
        dateFormatter.locale = NSLocale.current
        self.date = dateFormatter.string(from: date)
        self.userInstance.userData?.Date = self.date
        self.tableView.reloadRows(at: [IndexPath(item: 6, section: 0)], with: .none)
    }
    alert.addAction(title: "OK", style: .cancel)
    alert.show()

}

这里是我改变时间的地方:

@objc func timeChanged(sender: UIButton){
    var maxDate = Date()
    if (userInstance.userData?.Date != nil) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MM-dd-yyyy" //Your date format
        dateFormatter.locale = NSLocale.current
        //dateFormatter.timeZone = TimeZone(abbreviation: "GMT") //Current time zone
        let date = dateFormatter.date(from: ((userInstance.userData?.Date)!))
        if(date! >= maxDate){
            maxDate = date!
            let alert = UIAlertController(style: .actionSheet, title: "Select Time")
            alert.addDatePicker(mode: .time, date: maxDate, minimumDate: nil , maximumDate: maxDate) { date in
                let timeFormatter = DateFormatter()
                timeFormatter.dateFormat = "hh:mm a"
                timeFormatter.amSymbol = "AM"
                timeFormatter.pmSymbol = "PM"
                self.time = timeFormatter.string(from: date)
                self.userInstance.userData?.Time = self.time
                self.tableView.reloadRows(at: [IndexPath(item: 6, section: 0)], with: .none)
            }
            alert.addAction(title: "OK", style: .cancel)
            alert.show()
        }else{
            let alert = UIAlertController(style: .actionSheet, title: "Select Time")
            alert.addDatePicker(mode: .time, date: maxDate, minimumDate: nil , maximumDate: nil) { date in
                let timeFormatter = DateFormatter()
                timeFormatter.dateFormat = "hh:mm a"
                timeFormatter.amSymbol = "AM"
                timeFormatter.pmSymbol = "PM"
                self.time = timeFormatter.string(from: date)
                self.userInstance.userData?.Time = self.time
                self.tableView.reloadRows(at: [IndexPath(item: 6, section: 0)], with: .none)
            }
            alert.addAction(title: "OK", style: .cancel)
            alert.show()
        }

    }else{
        let alert = UIAlertController(style: .actionSheet, title: "Select Time")
        alert.addDatePicker(mode: .time, date: maxDate, minimumDate: nil , maximumDate: maxDate) { date in
            let timeFormatter = DateFormatter()
            timeFormatter.dateFormat = "hh:mm a"
            timeFormatter.amSymbol = "AM"
            timeFormatter.pmSymbol = "PM"
            self.time = timeFormatter.string(from: date)
            self.userInstance.userData?.Time = self.time
            self.tableView.reloadRows(at: [IndexPath(item: 6, section: 0)], with: .none)
        }
        alert.addAction(title: "OK", style: .cancel)
        alert.show()
    }
}

在最后两个函数中,日期和时间设置错误。这段代码的整个逻辑是,如果日期设置为等于或大于当前日期,则将时间限制为当前时间,如果小于当前日期,则不会发生时间限制。

【问题讨论】:

    标签: swift date datepicker swift4


    【解决方案1】:

    您的时间更新代码也应该将 self.date 更新为相应的值。

    另外,我建议拆分您的代码来完成日期选择器工作 - 结果会更具可读性,因此更容易理解和调试。

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      相关资源
      最近更新 更多