La manera más limpia es probablemente registrar un DataBinder personalizado para posibles formatos de fecha.
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CustomDateBinder extends PropertyEditorSupport {
private final List<String> formats;
public CustomDateBinder(List formats) {
List<String> formatList = new ArrayList<String>(formats.size());
for (Object format : formats) {
formatList.add(format.toString()); // Force String values (eg. for GStrings)
}
this.formats = Collections.unmodifiableList(formatList);
}
@Override
public void setAsText(String s) throws IllegalArgumentException {
if (s != null)
for (String format : formats) {
// Need to create the SimpleDateFormat every time, since it's not thead-safe
SimpleDateFormat df = new SimpleDateFormat(format);
try {
setValue(df.parse(s));
return;
} catch (ParseException e) {
// Ignore
}
}
}
}
También había necesidad de implementar un PropertyEditorRegistrar
import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.PropertyEditorRegistry;
import grails.util.GrailsConfig;
import java.util.Date;
import java.util.List;
public class CustomEditorRegistrar implements PropertyEditorRegistrar {
public void registerCustomEditors(PropertyEditorRegistry reg) {
reg.registerCustomEditor(Date.class, new CustomDateBinder(GrailsConfig.get("grails.date.formats", List.class)));
}
}
y crear una definición de primavera-frijol en su griales-app/conf/primavera/resources.groovy:
beans = {
"customEditorRegistrar"(CustomEditorRegistrar)
}
y finalmente defina los formatos de fecha en su grial-app/conf/Config.groovy:
grails.date.formats = ["yyyy-MM-dd HH:mm:ss.SSS ZZZZ", "dd.MM.yyyy HH:mm:ss"]
¿Solo me pregunto si hay una razón por la que elegiría implementar esto en Java (como arriba) en lugar de Groovy? El código sería un poco más corto con Groovy. –
Implementé una pieza similar de código en Java en tiempos anteriores cuando Groovy era mucho más lento de lo que es ahora. Groovy dio un gran salto adelante en este asunto. Solo estoy reutilizando el antiguo código Java de la pereza ;-) –
Una buena pieza de código, un clásico de lo que harías. Aunque la forma más limpia sería utilizar la configuración regional para recuperar el formato en lugar de iterar a través de los intentos de análisis. – Gepsens