为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喵时光机 2024-01-28 17:27:17
DatePicker我的尝试是将 a (处理日期选择,但不处理时间)和 a TextField(处理时间)的值统一为LocalDateTime两者连接的可观察值。我已经在模型中为两者设置了可观察的属性,但我在加入它们时遇到了困难。到目前为止,我设法进行了一些尝试Bindings.createObjectBinding(),但似乎没有取得太大成功。我想至少知道我是否走在正确的道路上,或者我应该采取不同的方式吗?
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

通过使用,您可以从 a和 aLocalDateTime#of(LocalDate,LocalTime)创建 a 。您现在需要的是一种获取 a和 a实例的方法。幸运的是,该控件为您提供了它的值,因此我们已经完成了。接下来是找到一种从 a获取 a 的方法。这可以通过使用 a和 a来实现,a 和a 知道如何将 a 转换为 a ,反之亦然。此用例有一个内置的: 。LocalDateTimeLocalDateLocalTimeLocalDateLocalTimeDatePickerLocalDateLocalTimeTextFieldTextFormatterStringConverterStringLocalTimeStringConverterLocalTimeStringConverter

一旦我们拥有了DatePicker和 the,TextFormatter我们就需要创建一个绑定,该绑定LocalDateTime从这两个值创建 a。由于DatePickerTextFormatter都有一个value属性,该属性分别保存 aLocalDate和 (在本例中LocalTime为 a ),因此使用 来创建绑定相对简单Bindings#createObjectBinding(Callable,Observable...)

DatePicker dp = new DatePicker();

// Have to associate the TextFormatter with a TextField

TextFormatter<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。


查看完整回答
反对 回复 2024-01-28
  • 1 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信