Search code examples
iosswiftnsdateformatter

Weekday from UIDatePicker


I want to set my dateField Label to show both the date as well as the weekday. Currently it only shows the date. I attempted to follow this question Displaying the Day Of The Week From Date Picker but it is not the solution for my case.

enter image description here

 let picker = UIDatePicker()
func createDatePicker(){

    let toolbar = UIToolbar()
    toolbar.sizeToFit()

    let done = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed))

    toolbar.setItems([done], animated: false)

    dateField.inputAccessoryView = toolbar
    dateField.inputView = picker
    picker.datePickerMode = .dateAndTime

}
 @objc func donePressed(){

    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    formatter.timeStyle = .none
    let dateString = formatter.string(from: picker.date)


    dateField.text = "\(dateString)"
    showTime()
    self.view.endEditing(true)
}

   @objc func datePickerValueChanged(sender: UIDatePicker){
    let formatter = DateFormatter()
    formatter.dateStyle = DateFormatter.Style.medium
    formatter.timeStyle = DateFormatter.Style.none
    dateField.text = formatter.string(from: sender.date)

}
func showTime(){

    let formatter = DateFormatter()
    formatter.dateStyle = DateFormatter.Style.none
    formatter.timeStyle = DateFormatter.Style.short
    timeField.text = formatter.string(from: picker.date)

}

Solution

  • Your question is really just about how to format a Date to show a medium date format plus the weekday.

    The only standard date style that shows the weekday is the .full format but that is not what you want.

    One solution is to set a specific dateFormat such as yyyy-MM-dd, EEE but you want a format appropriate for the user's locale.

    The following will do what you need:

    @objc func donePressed(){
        let formatter = DateFormatter()
        // MMMddyyyy is essentially the same as the "medium" format
        formatter.setLocalizedDateFormatFromTemplate("MMMddyyyyEEE")
        let dateString = formatter.string(from: picker.date)
    
        dateField.text = "\(dateString)"
        showTime()
        self.view.endEditing(true)
    }
    

    In the USA, the format will become: "EEE, MMM dd, yyyy". In other locales it will show whatever is appropriate.