Localdate.format,未应用格式

Localdate.format, format is not applied

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

    LocalDate localDate = purchased_at.getValue();
    localDate.format(DateTimeFormatter.ofPattern("dd.mm.yyyy"));

这是我得到的错误。

Caused by: java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: MinuteOfHour

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

不要格式化日期以便插入到 SQL 数据库中。假设您的数据库列的数据类型为 date 并且您至少使用 Java 8 和至少 JDBC 4.2,只需将 LocalDate 传递给您的 PreparedStatement 作为它是:

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

您的 JDBC driver 会处理剩下的事情。如果使用 JPA,您的 JPA 实现也会处理它。

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

    String formattedDate = purchaseDate.toString();
    System.out.println(formattedDate);

在我的例子中输出是:

2017-11-29

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

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

输出:

29.11.2017

你的代码出了什么问题?

有两处错误:

  1. 您使用了小写 mm。这意味着小时的分钟,并且由于 LocalDate 中没有一天中的时间,所以它抛出了您看到的异常。您收到的消息非常准确:

Unsupported field: MinuteOfHour

two-digit 个月,您可以使用大写 MM

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

链接

我不得不为我的日期选择器使用字符串转换器。

    public String changeformat(DatePicker date) {

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

        {
            date.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;
            }
        }
    });
    return null;
}

它工作得很好。我必须使用一个参数,因为我目前正在使用 5 个日期选择器。