首页 文章

如何正确设置最小日期并获取选择器视图上显示的最小日期?

提问于
浏览
1

enter image description here

我有一个弹出式视图控制器,如上图所示 . 在 viewDidLoad 中,我设置了选择器视图的最小日期(Date()),在故事板中,我将间隔时间设置为15分钟 . 这是我使用的代码

class DateTimePickerVC: UIViewController {


    @IBOutlet var dateTimePickerView: UIDatePicker!

    var selectedDateAndTime : Date?

    override func viewDidLoad() {
        super.viewDidLoad()

        // to make live update of selected date
        dateTimePickerView.addTarget(self, action: #selector(DateTimePickerVC.datePickerValueChanged), for: UIControl.Event.valueChanged)

        // minimum date is now
        dateTimePickerView.minimumDate = Date()

        // set initial value, to avoid nil value
        selectedDateAndTime = dateTimePickerView.date


    }

    @objc func datePickerValueChanged (datePicker: UIDatePicker) {
        selectedDateAndTime = datePicker.date
    }



    @IBAction func pickedButtonDidPressed(_ sender: Any) {
        // send date 'selectedDateAndTime' to other VC
    }

}

我在这里遇到两个问题:

  • 假设用户在16:28打开弹出的datePickerVC . 我希望弹出的最短日期和时间将是“今天16:30”,但在我的情况下是“今天16:15” . 怎么解决这个问题?

  • 以避免 selectedDateAndTime 的nil值,在 viewDidLoad 我设置 selectedDateAndTime = dateTimePickerView.date ,所以我希望当用户立即点击保存按钮并将 date 发送到其他VC而不滚动日期选择器时,它将获得datePicker中显示的最小日期 . 假设用户在16:08打开弹出,我希望所选日期是datePickerView(今天16:15)显示的最小日期和时间,但我得到的实际日期值是(今天16:08),因为我设置了 datePicker.minimumDate = Date() (现在) . 如何获取datePicker视图上显示的最小日期?

2 回答

  • 1
    enum DateRoundingType {
        case round
        case ceil
        case floor
    }
    
    
    extension Date {
        func rounded(minutes: TimeInterval, rounding: DateRoundingType = .round) -> Date {
            return rounded(seconds: minutes * 60, rounding: rounding)
        }
        func rounded(seconds: TimeInterval, rounding: DateRoundingType = .round) -> Date {
            var roundedInterval: TimeInterval = 0
            switch rounding  {
            case .round:
                roundedInterval = (timeIntervalSinceReferenceDate / seconds).rounded() * seconds
            case .ceil:
                roundedInterval = ceil(timeIntervalSinceReferenceDate / seconds) * seconds
            case .floor:
                roundedInterval = floor(timeIntervalSinceReferenceDate / seconds) * seconds
            }
            return Date(timeIntervalSinceReferenceDate: roundedInterval)
        }
    }
    

    用法:

    //add below code in viewDidLoad()
    let nextMinuteIntervalDate = Date().rounded(
        minutes: 15,
        rounding: .ceil
    )
    dateTimePickerView.minimumDate = nextMinuteIntervalDate
    dateTimePickerView.setDate(nextMinuteIntervalDate, animated: true)
    
  • 2
    • 我认为你必须意识到为什么它显示16:15,因为时间(16:28)仍然在逻辑上小于16:30而且我没有任何逻辑意义

    • 通过 minimumDate 的声明:

    var minimumDate:日期?

    由于 minimumDate 具有 get 属性,因此您可以使用以下方法获取最小日期:

    // Since it is an optional , we have to safe unwrap it 
    if let minimumDate = datePicker.minimumDate {
       // Use your minimumDate variable here
    }
    

相关问题