java - Localdate.format, el formato no se aplica
javafx datepicker (2)
Tengo un DatePicker en mi FXML y necesito la fecha para insertarlo en mi base de datos SQL. Quiero formatear mi fecha pero no funciona.
LocalDate localDate = purchased_at.getValue();
localDate.format(DateTimeFormatter.ofPattern("dd.mm.yyyy"));
Este es el error que recibo.
Caused by: java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: MinuteOfHour
Todavía soy una especie de principiante. Tuve Java durante los últimos 3 o 4 meses ahora. Estoy haciendo mi mejor esfuerzo para mejorar.
No formatee su fecha de inserción en su base de datos SQL.
Suponiendo que la columna de su base de datos tenga una
date
tipo de datos y que esté utilizando al menos Java 8 y al menos JDBC 4.2, simplemente pase la
LocalDate
a su Estado de
PreparedStatement
tal como está:
PreparedStatement insertStmt = myConnection.prepareStatement(
"insert into my_table(purchase_date) values (?)");
insertStmt.setObject(1, purchaseDate);
Tu conductor JDBC se encargará del resto. Si usa JPA, su implementación de JPA también se hará cargo de ello.
Si su columna tiene tipo char (por ejemplo,
varchar(10)
) y no puede cambiarla, no invente su propio formato.
Almacenar la fecha en formato ISO 8601.
LocalDate.toString()
produce este formato.
String formattedDate = purchaseDate.toString();
System.out.println(formattedDate);
En mi caso la salida fue:
2017-11-29
Además, para la presentación a su usuario, tampoco debe inventar su propio formato. Más bien confiar en los formatos incorporados en Java. Por ejemplo:
Locale turkish = Locale.forLanguageTag("tr");
DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(turkish);
String formattedDate = purchaseDate.format(dateFormatter);
System.out.println(formattedDate);
Salida:
29.11.2017
¿Qué salió mal en tu código?
Hay dos cosas mal:
-
Usaste
mm
minúsculas. Esto significa un minuto de hora, y dado queLocalDate
no tiene una hora del día, arrojó la excepción que vio. El mensaje que recibiste es bastante preciso:Campo no compatible: MinuteOfHour
En su lugar, puede usar
MM
mayúsculas para el mes de dos dígitos. -
Debe seleccionar el formato en el
String
devuelto por el método deformat
. ElLocalDate
es inmutable y, por lo tanto, no se ve afectado por la llamada al método. Tampoco puede tener un formato en ella. Es solo una fecha en el calendario.
Enlace: Artículo de Wikipedia: ISO 8601
Tuve que usar un convertidor de cadenas para mi Selector de fechas.
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;
}
Funcionó perfectamente bien. Tuve que usar un parámetro ya que actualmente estoy usando 5 Selladores de fechas.