【问题标题】:JavaFX DatePicker getValue in a specific format特定格式的 JavaFX DatePicker getValue
【发布时间】:2015-01-06 01:24:56
【问题描述】:

我目前正在使用 Scene Builder 制作 javafx 场景。我想以特定格式从日期选择器中获取价值。只需使用 datePicker.getValue() 以 yyyy-mm-dd 形式返回日期值。我想要 MMM dd, yyyy 形式。有人可以帮我吗?

当前完整的datePickerController代码是这样的

package date.picker;

import java.net.URL;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TextField;
import javafx.util.StringConverter;

/**
 * FXML Controller class
 *
 * @author Dushyant Patel
 */
public class DatePickerController implements Initializable {

@FXML
private TextField display;
@FXML
private DatePicker datePicker;
@FXML
private Button getDateBtn;
@FXML
private Button setDateBtn;

@FXML
private void getDateAction(ActionEvent event) {

    LocalDate date = datePicker.getValue();
    if (date != null) {
        display.setText(date.toString());
    } else {
        display.setText("");
    }
}

@FXML
private void datePickerAction(ActionEvent event) {
    LocalDate date = datePicker.getValue();
    if (date != null) {
        display.setText(date.toString());
    } else {
        display.setText("");
    }
}

@FXML
private void setDateAction(ActionEvent event) {
    if (!display.getText().trim().equals("")) {
        if (display.getText().length() != 10) {
            Alert alert = new Alert(AlertType.ERROR);
            alert.setTitle("Error Dialog");
            alert.setHeaderText("Date Error");
            alert.setContentText("Please type date in the correct date format!");

            alert.showAndWait();
        } else {
            LocalDate date = LocalDate.parse(display.getText());
            datePicker.setValue(date);
        }
    } else {
        datePicker.setValue(null);
    }

}

/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {
    String pattern = "MMM dd, yyyy";
    StringConverter converter = new StringConverter<LocalDate>() {
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(pattern);

        @Override
        public String toString(LocalDate date) {
            if (date != null) {
                return dateFormatter.format(date);
            } else {
                return "";
            }
        }

        @Override
        public LocalDate fromString(String string) {
            if (string != null && !string.isEmpty()) {
                return LocalDate.parse(string, dateFormatter);
            } else {
                return null;
            }
        }
    };

    datePicker.setConverter(converter);
}

}

【问题讨论】:

  • Format date in java的可能重复
  • 这个问题似乎只涉及java.util.Dates,而不是java.time.LocalDates
  • 认真阅读有帮助.... :-D ... 所以使用: String date(LocalDate date) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy");返回日期。格式(格式化程序); }

标签: java date datepicker javafx


【解决方案1】:

DataPicker 在数据选择器中引用转换器

 datePicker.setConverter(new StringConverter<LocalDate>() {
 String pattern = "yyyy-MM-dd";
 DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(pattern);

 {
     datePicker.setPromptText(pattern.toLowerCase());
 }

 @Override public String toString(LocalDate date) {
     if (date != null) {
         return dateFormatter.format(date);
     } else {
         return "";
     }
 }

 @Override public LocalDate fromString(String string) {
     if (string != null && !string.isEmpty()) {
         return LocalDate.parse(string, dateFormatter);
     } else {
         return null;
     }
 }
});

【讨论】:

  • 谢谢,这对@Reegan 很有帮助
【解决方案2】:

使用您指定的模式创建一个DateTimeFormatter(您为该模式提供的语法完全正确;文档详细介绍了该模式的语法)。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy");

// ...

LocalDate date = datePicker.getValue();
if (date != null) {
    display.setText(formatter.format(date));
} else {
    display.setText("");
}

【讨论】:

    【解决方案3】:

    使用 setConverter 不会改变你用来获取 DatePicker 值的 .getValue() 方法的格式 setConverter 只会改变 DatePicker 上显示的日期。

    例如获取 DatePicker 值:-

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy",Locale.US);
    String formattedValue = (myDatePicker.getValue()).format(formatter);
    

    并设置 DatePicker 的值

    String dateValue = "01 12, 2015";
    myDatePicker.setValue(LocalDate.parse(dateValue,formatter));
    

    【讨论】:

      【解决方案4】:

      docs 提供了一个很好的例子。只要确保你的控制器实现Initializable,然后像这样初始化它:

      public class MyController implements Initializable {
      
        @FXML
        private DatePicker myDatePicker;
      
        @Override
        public void initialize(URL location, ResourceBundle resources) {
      
          myDatePicker.setConverter(
              new StringConverter<>() {
                final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
      
                @Override
                public String toString(LocalDate date) {
                  return (date != null) ? dateFormatter.format(date) : "";
                }
      
                @Override
                public LocalDate fromString(String string) {
                  return (string != null && !string.isEmpty())
                      ? LocalDate.parse(string, dateFormatter)
                      : null;
                }
              });
      
        }
      
      }
      

      【讨论】:

        【解决方案5】:

        使用 SimleDateFormat:

            SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy");
            setText(format.format(date));
        

        糟糕……LocalDate 不是日期……

           String date(LocalDate date) {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy");
                return date.format(formatter);
            }
        

        【讨论】:

        • 您不能将其与java.time.LocalDate 一起使用。
        • 对不起...戴眼镜可能会有所帮助:-D
        • 仅供参考,非常麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle
        猜你喜欢
        • 2014-12-23
        • 2020-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 2022-01-18
        • 2014-12-07
        • 1970-01-01
        相关资源
        最近更新 更多