Localdate.format,格式不适用

Vin*_*ins 1 java javafx date datepicker fxml

我的 FXML 中有一个 DatePicker,我需要将它插入到我的 SQL 数据库中的日期。我想格式化我的日期,但它不起作用。

    LocalDate localDate = purchased_at.getValue();
    localDate.format(DateTimeFormatter.ofPattern("dd.mm.yyyy"));
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误。

Caused by: java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: MinuteOfHour
Run Code Online (Sandbox Code Playgroud)

我还是个初学者。在过去的 3 或 4 个月里,我使用了 Java。我正在努力改进。

Ole*_*.V. 6

不要格式化您的日期以插入到您的 SQL 数据库中。假设您的数据库列具有数据类型,date并且您至少使用 Java 8 和至少 JDBC 4.2,只需按原样传递LocalDate给您PreparedStatement

    PreparedStatement insertStmt = myConnection.prepareStatement(
            "insert into my_table(purchase_date) values (?)");
    insertStmt.setObject(1, purchaseDate);
Run Code Online (Sandbox Code Playgroud)

您的 JDBC 驱动程序将负责其余的工作。如果使用 JPA,您的 JPA 实现也会处理它。

如果您的列具有 char 类型(例如varchar(10))并且您无法更改它,请不要为它发明自己的格式。以 ISO 8601 格式存储日期。LocalDate.toString()产生这种格式。

    String formattedDate = purchaseDate.toString();
    System.out.println(formattedDate);
Run Code Online (Sandbox Code Playgroud)

在我的情况下,输出是:

2017-11-29

顺便说一句,为了向用户展示,您也不应该发明自己的格式。而是依赖于 Java 中的内置格式。例如:

    Locale turkish = Locale.forLanguageTag("tr");
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
            .withLocale(turkish);
    String formattedDate = purchaseDate.format(dateFormatter);
    System.out.println(formattedDate);
Run Code Online (Sandbox Code Playgroud)

输出:

29.11.2017

你的代码出了什么问题?

有两点不对:

  1. 您使用了小写字母mm。这意味着一分钟,因为 aLocalDate没有一天中的时间,所以它抛出了你看到的异常。您收到的消息非常准确:

不支持的字段:MinuteOfHour

相反,您可以使用大写字母MM表示两位数的月份。

  1. 您需要Stringformat方法返回的格式中获取格式。该LocalDate是不可改变的,因此不影响该方法调用。它也不能有格式。这只是日历中的一个日期。

链接