El formato de fechas con el tiempo, sólo si hay un momento en la fecha

Sam:

Estoy tratando de higienizar las fechas que se generan desde otra aplicación. A veces, las fechas pueden ser de un formato incorrecto, cuando lo son, deben ser borradas a cabo. Las condiciones generales deben ser;

  • Cualquier fecha en o antes del año 1900 no se consideran válidas y blanqueó a cabo

  • Cualquier fecha después del año en curso no se consideran válidas y blanqueó a cabo

  • Las fechas válidas que coinciden con los patrones deben devolverse en la salida yyyy-MM-dd HH:mm:ss(donde hay una marca de tiempo disponible) o yyyy-MM-ddcuando no hay marca de tiempo disponible.

Fechas <= 1900 y después del año en curso se consideran válidos a medida que se cargan en otro sistema, en estas fechas no tienen sentido en el contexto de la aplicación. Por la misma razón, tengo que devolver las fechas en el formato antes mencionado para que puedan ser cargados en la siguiente aplicación.

¿Cómo puedo modificar mi código de abajo para las fechas de mango que no tienen una marca de tiempo? El código actual da un error de: java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDaycuando intenta llamada;SanitiseDate("01/01/2001")

Aquí está mi código hasta ahora:

public static String SanitiseDate(String input) {
    DateTimeFormatter[] possibleFormats = {
            DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("uuuu/MM/dd").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("dd/MM/uuuu").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("dd-MM-uuuu").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("mm-DD-uuuu").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("mm-DD-uuuu HH:mm").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("mm-DD-uuuu HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),
    };

    for (DateTimeFormatter format : possibleFormats) {
        try {
            LocalDate result = LocalDate.parse(input, format);
            if (result.getYear() <= 1900 || result.getYear() > Year.now().getValue())
            {
                return "";
            }
            return result.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        } catch (DateTimeParseException dtpe) {
            // ignore, try next format
        }
    }
    return "";
}

Mis pruebas:

@Test
public void sanitiseDateTest()
{
    assertEquals("", StringUtil.SanitiseDate(""));
    assertEquals("", StringUtil.SanitiseDate("01/01/1601"));
    assertEquals("", StringUtil.SanitiseDate("01/01/1501"));
    assertEquals("2001-01-01", StringUtil.SanitiseDate("01/01/2001"));
    assertEquals("1980-01-01", StringUtil.SanitiseDate("01/01/1980"));
    assertEquals("", StringUtil.SanitiseDate("05/05/1900"));
    assertEquals("", StringUtil.SanitiseDate("01/01/1989"));
    assertEquals("1901-01-01", StringUtil.SanitiseDate("01/01/1901"));
    assertEquals("2020-02-29", StringUtil.SanitiseDate("29/02/2020"));
    assertEquals("2020-01-29", StringUtil.SanitiseDate("29/01/2020"));
    assertEquals("2020-01-29 01:00:00", StringUtil.SanitiseDate("29/01/2020 01:00:00"));
    assertEquals("", StringUtil.SanitiseDate("12/12/2030 01:00:00"));
    assertEquals("", StringUtil.SanitiseDate("12/12/2030 01:00:00; 12/12/2030 01:00:00;"));
}
Joakim Danielson:

Puesto que usted quiere manejar dos entradas diferentes y también generar dos tipos de salida que necesita para dividir la lógica entre las fechas de entrada con y sin tiempo y manejarlos por separado. No incluir los formateadores pero tengo dividirlas en dos matrices, una para formateadores sin un patrón de tiempo y otro para los que tienen un patrón de tiempo

if (input.length() < 10) { // maybe add check for >
    return ""; 
}

if (input.length() == 10) {
    for (final DateTimeFormatter format : possibleFormats1) {
        try {
            final LocalDate result = LocalDate.parse(input, format);
            if (result.getYear() <= 1900 || result.getYear() > Year.now().getValue()) {
                return "";
            }
            return result.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        } catch (final DateTimeParseException dtpe) {
            // ignore, try next format
        }
    }
} else {
    for (final DateTimeFormatter format : possibleFormats2) {

        try {
            final LocalDateTime result = LocalDateTime.parse(input, format);
            if (result.getYear() <= 1900 || result.getYear() > Year.now().getValue()) {
                return "";
            }
            return result.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        } catch (final DateTimeParseException dtpe) {
            // ignore, try next format
        }
    }
}
return "";

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=292897&siteId=1
Recomendado
Clasificación