在 Java 中,如何将 LocalDate 和时间格式的字符串连接到 LocalDateTime

DatePicker我的尝试是将 a (处理日期选择,但不处理时间)和 a TextField(处理时间)的值统一为LocalDateTime两者连接的可观察值。

我已经在模型中为两者设置了可观察的属性,但我在加入它们时遇到了困难。

到目前为止,我设法进行了一些尝试Bindings.createObjectBinding(),但似乎没有取得太大成功。

我想至少知道我是否走在正确的道路上,或者我应该采取不同的方式吗?


喵喵时光机
浏览 108回答 1
1回答

互换的青春

通过使用,您可以从 a和 aLocalDateTime#of(LocalDate,LocalTime)创建 a 。您现在需要的是一种获取 a和 a实例的方法。幸运的是,该控件为您提供了它的值,因此我们已经完成了。接下来是找到一种从 a获取 a 的方法。这可以通过使用 a和 a来实现,a 和a 知道如何将 a 转换为 a ,反之亦然。此用例有一个内置的: 。LocalDateTimeLocalDateLocalTimeLocalDateLocalTimeDatePickerLocalDateLocalTimeTextFieldTextFormatterStringConverterStringLocalTimeStringConverterLocalTimeStringConverter一旦我们拥有了DatePicker和 the,TextFormatter我们就需要创建一个绑定,该绑定LocalDateTime从这两个值创建 a。由于DatePicker和TextFormatter都有一个value属性,该属性分别保存 aLocalDate和 (在本例中LocalTime为 a ),因此使用 来创建绑定相对简单Bindings#createObjectBinding(Callable,Observable...)。DatePicker dp = new DatePicker();// Have to associate the TextFormatter with a TextFieldTextFormatter<LocalTime> tf = new TextFormatter<>(new LocalTimeStringConverter());ObjectBinding<LocalDateTime> binding = Bindings.createObjectBinding(() -> {    LocalDate ld = dp.getValue();    LocalTime lt = tf.getValue();    return ld == null || lt == null ? null : LocalDateTime.of(ld, lt);}, dp.valueProperty(), tf.valueProperty());这是一个完整的示例:import javafx.application.Application;import javafx.beans.binding.Bindings;import javafx.beans.binding.ObjectBinding;import javafx.geometry.Insets;import javafx.geometry.Pos;import javafx.scene.Scene;import javafx.scene.control.DatePicker;import javafx.scene.control.Label;import javafx.scene.control.TextField;import javafx.scene.control.TextFormatter;import javafx.scene.layout.HBox;import javafx.scene.layout.VBox;import javafx.stage.Stage;import javafx.util.converter.LocalTimeStringConverter;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;import java.time.format.DateTimeFormatter;public class App extends Application {  @Override  public void start(Stage primaryStage) {    DatePicker datePicker = new DatePicker();    datePicker.setValue(LocalDate.now());    TextField timeField = new TextField();    TextFormatter<LocalTime> timeFieldFormatter =        new TextFormatter<>(new LocalTimeStringConverter());    timeField.setTextFormatter(timeFieldFormatter);    timeFieldFormatter.setValue(LocalTime.now());    HBox dateTimeBox = new HBox(10, datePicker, timeField);    dateTimeBox.setAlignment(Pos.CENTER);    ObjectBinding<LocalDateTime> ldtBinding = Bindings.createObjectBinding(() -> {      LocalDate date = datePicker.getValue();      LocalTime time = timeFieldFormatter.getValue();      return date == null || time == null ? null : LocalDateTime.of(date, time);    }, datePicker.valueProperty(), timeFieldFormatter.valueProperty());    Label ldtLabel = new Label();    ldtLabel.textProperty().bind(Bindings.createStringBinding(() -> {      LocalDateTime dateTime = ldtBinding.get();      return dateTime == null ? null : dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);    }, ldtBinding));    VBox root = new VBox(15, dateTimeBox, ldtLabel);    root.setAlignment(Pos.CENTER);    root.setPadding(new Insets(25));    primaryStage.setScene(new Scene(root));    primaryStage.show();  }}上面将 a 的文本绑定Label到ObjectBinding<LocalDateTime>. TextFormatter只要文本被“提交”(例如,在获得焦点Enter时按下) , 的值就会更新TextField。我构建的方式LocalTimeStringConverter意味着它将使用我的Locale和FormatStyle.SHORT来解析和格式化LocalTime. 举个例子,对我来说这意味着类似3:30 PMor 的东西11:25 AM。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java