2011-04-27 22 views
10

Mi objetivo es tener un análisis estricto (y prohibir fechas como '98/99 ', por ejemplo). Sin embargo, el siguiente código plantea una java.text.ParseException con la fecha unparseable mensaje : "98/01":¿Cómo se analiza estrictamente una fecha con solo un año y un número de semana cuando el primer día de esta semana es el año anterior?

SimpleDateFormat sdf = new SimpleDateFormat("yy/ww"); 
sdf.setLenient(false); 
sdf.parse("98/01"); 

Este es de hecho para el first week of 1998, que comienza el jueves. Sin embargo, el análisis sintáctico de una semana siempre devuelve la fecha del primer día de esta semana. En ese caso, sería 12/29/1997. Y esta es la razón por la cual se plantea una excepción.

Parece que este problema viene de la clase GregorianCalendar y más concretamente a partir del método computeTime() que comprueba si los campos originales coinciden con los campos impuesta externamente cuando el análisis es no indulgente:

if (!isLenient()) { 
    for (int field = 0; field < FIELD_COUNT; field++) { 
    if (!isExternallySet(field)) { 
     continue; 
    } 

    if (originalFields[field] != internalGet(field)) { 
     // Restore the original field values 
     System.arraycopy(originalFields, 0, fields, 0, fields.length); 
     throw new IllegalArgumentException(getFieldName(field)); 
    } 
    } 
} 

¿Es esta una ¿error? Creo que el análisis 1998/01 debería devolver 12/29/1997 y no generar ninguna excepción. Sin embargo, ¿sabe cómo hacer que el análisis devuelva 01/01/1998 (que sería el primer día de la semana en el año especificado)?

+0

¿Has probado "Yoda time" lib? Yo personalmente no, pero escuché que es superior a las clases de fecha/hora de JDK. –

+0

Lo probé [Joda Time] (http://joda-time.sourceforge.net/), pero no pude hacerlo funcionar. –

Respuesta

3

creo que esto debería funcionar para usted (se necesita el tiempo en la biblioteca para esta joda):

public static Date parseYearWeek(String yearWeek) { 
    DateTime dateTime = DateTimeFormat.forPattern("yy/ww").parseDateTime(yearWeek); 

    if (dateTime.getWeekOfWeekyear() == 1 && dateTime.getMonthOfYear() == 12) { 
     dateTime = DateTimeFormat.forPattern("yyyy/mm").parseDateTime((dateTime.getYear() + 1) + "/01"); 
    } 

    return dateTime.toDate(); 
} 
+0

Es perfecto. Todavía aprovecho el análisis 'SimpleDateFormat', pero utilizo su enfoque cada vez que se lanza una' ParseException'. –

0

usted podría utilizar como referencia Jueves, restar 3 días para calcular la fecha del lunes. La definición ISO 8601 de la semana 1 es la primera semana en que ocurre el jueves. Esto eliminará el código de compensación. El siguiente código encontrará el lunes en una semana, incluso si el lunes está en el año "anterior".

String yearWeek = "201301"; 
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyywwEEE").withLocale(Locale.US); 
DateTime mondayInWeek= fmt.parseDateTime(yearWeek + "Thu").minusDays(3);// ISO 8601 def of week 1 is first week where Thursday occurs 
System.out.println(mondayInWeek); 
Cuestiones relacionadas