JavaFX日期选择器以特定格式获取日期值

8

我目前正在使用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);
}

}

可能是重复的问题:在Java中格式化日期 - Jeen Broekstra
那个问题似乎只涉及到 java.util.Date,而不是 java.time.LocalDate - James_D
阅读是非常重要的... :-D ...所以使用: String date(LocalDate date) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy"); return date.format(formatter); } - Jens-Peter Haack
5个回答

7

DataPicker 在 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 - Ali.bu

2
使用 setConverter 不会改变 .getValue() 方法的格式,该方法用于获取 DatePicker 的值。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));

2
使用您指定的模式创建一个 DateTimeFormatter(您提供的模式语法完全正确;文档详细介绍了模式语法)。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy");

// ...

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

1

文档提供了一个很好的例子。只需确保您的控制器实现了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;
          }
        });

  }

}

0
使用SimpleDateFormat:
    SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy");
    setText(format.format(date));

糟糕... LocalDate 不是 Date....

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

你不能在 java.time.LocalDate 中使用那个。 - James_D
抱歉...使用眼镜可能会有所帮助 :-D - Jens-Peter Haack
FYI,像 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等旧的日期时间类现已成为 legacy,并被内置在 Java 8 及更高版本中的 java.time 类所取代。请参阅 Oracle 的 教程 - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接