es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

JDK-11 presenta la introducción de la coma en el formato de fecha.

Tengo el siguiente método que genera la fecha en formato “3 de enero de 2022 9:06:16 PM” cuando se ejecuta en JDK-8. Sin embargo, tan pronto como cambié mi JDK a JDK-11, genera la fecha en formato “3 de enero de 2022, 9:12:28 PM”. Por lo tanto, hay una diferencia de “coma después de 2022” en la salida. Mi caso de prueba está fallando debido a esta discrepancia. Necesito hacer que JDK-11 genere el mismo formato en mi método de servicio, como se muestra a continuación –

private DateFormat getLocaleDateFormat(@Nullable final Locale locale, @Nonnull final TimeZone timeZone) {
    final DateFormat localDf;
    if (locale == null) {
        localDf = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
    } else {
        localDf = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, locale);
    }
    final String timeZoneOffsetString = DateUtils.getTimeZoneOffset(timeZone.getRawOffset(), true);
    final String localTimeZoneStr = "GMT" + timeZoneOffsetString;
    final TimeZone localTz = TimeZone.getTimeZone(localTimeZoneStr);
    localDf.setTimeZone(localTz);

    return localDf;
}

Mi método de prueba se ve así –

@Test
public void canGetAuditReportWithTimestampLocalized() throws ParseException {
    /* Todas las operaciones de análisis fallarán en caso de un valor incorrecto */
    String localDateValue = aGetAuditReportRequest().withHeader(HttpHeaders.ACCEPT_LANGUAGE.toString(), "en-US,en")
              .getNow(ReportsTable.class).getData().get(0).get(0);
    SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.US)
              .parse(localDateValue);
}

El método parse() falla en la posición 11, que es la posición exacta de la coma en el formato de fecha. Para mi sorpresa, al eliminar manualmente el carácter en la posición 11 usando un generador de cadenas o concatenación de cadenas, se introdujo algún valor no inglés como este – “2022年1月3日 下午11:35:57”.

public Date parse(String source) throws ParseException
{
    ParsePosition pos = new ParsePosition(0);
    Date result = parse(source, pos);
    if (pos.index == 0)
        throw new ParseException("Fecha no analizable: \"" + source + "\"",
            pos.errorIndex);
    return result;
}

¿Cómo hago que JDK-11 genere una fecha con el mismo formato?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La diferencia en el formato de fecha entre JDK-8 y JDK-11 se debe a la implementación actualizada de SimpleDateFormat en JDK-11. En JDK-11, la implementación predeterminada de SimpleDateFormat ha actualizado el formato para incluir una coma después del año, lo que está causando el fallo en su caso de prueba.

    Para resolver este problema, puede actualizar el método getLocaleDateFormat() para usar un patrón personalizado en lugar del patrón predeterminado devuelto por DateFormat.getDateTimeInstance(). Esto asegurará que el formato sea consistente en diferentes versiones de JDK.

    Aquí hay una versión actualizada del método getLocaleDateFormat():

    private DateFormat getLocaleDateFormat(@Nullable final Locale locale, @Nonnull final TimeZone timeZone) {
        // Crear un patrón personalizado sin coma después del año
        String pattern = "MMM d, yyyy h:mm:ss a";
    
        final DateFormat localDf;
        if (locale == null) {
            localDf = new SimpleDateFormat(pattern);
        } else {
            localDf = new SimpleDateFormat(pattern, locale);
        }
    
        final String timeZoneOffsetString = DateUtils.getTimeZoneOffset(timeZone.getRawOffset(), true);
        final String localTimeZoneStr = "GMT" + timeZoneOffsetString;
        final TimeZone localTz = TimeZone.getTimeZone(localTimeZoneStr);
        localDf.setTimeZone(localTz);
    
        return localDf;
    }
    

    Al utilizar un patrón personalizado, puede asegurarse de que el formato de fecha sea consistente en diferentes versiones de JDK. Esto debería resolver el fallo en su caso de prueba y asegurar que la fecha se analice correctamente.

Comments are closed.