Pregunta

El código siguiente muestra la implementación en tiempo joda problemática de cálculo semana. Este comportamiento no es un error sino una decisión de diseño Joda-Time utiliza la norma ISO estándar de lunes a domingo de la semana. (tal vez debe un error?)

Dada una fecha que necesito para calcular el número de la semana, este cálculo debe i18n en la naturaleza. Significado debe tener en cuenta la numeración de la semana correcto en función de la configuración regional del usuario.

El código de demostración a continuación muestra el cálculo equivocado por Joda-Time y cálculo correcto por el JDK, en la aplicación tratamos de seguir con Joda-Time es una solución superior para las manipulaciones de la fecha. Por lo tanto, debería ser la mezcla de los dos catálogos de cálculos de tiempo? Yo, obviamente, prefiero no, ¿ésta es una cosa segura a hacer o voy a entrar en casos de esquina (que tienen experiencia con fecha, calendario Sé que es un hecho de que este es un tema doloroso para Java).

En pocas palabras: ¿Cuál es la recomendada mejores prácticas para el requisito descrito

código de demostración Problema

Por favor, vea este calendario en línea que muestra los números de semana para un correcto ejemplo de cálculo semana.

public class JodaTest {
 static DateTimeFormatter formatter = DateTimeFormat.forPattern("ww yyyy");
 static SimpleDateFormat jdkFormatter = new SimpleDateFormat("ww yyyy");

 public static void main(String[] args) {
  DateTime time = new DateTime(/*year*/2009, /*monthOfYear*/12, /*dayOfMonth*/6, /*hourOfDay*/23, /*minuteOfHour*/0, /*secondOfMinute*/0, /*millisOfSecond*/0);

  StringBuilder buffer = new StringBuilder()
   .append("Testing date ").append(time.toString()).append("\n")
   .append("Joda-Time timezone is ").append(DateTimeZone.getDefault()).append(" yet joda wrongly thinks week is ").append(formatter.print(time)).append("\n")
   .append("JDK timezone is ").append(TimeZone.getDefault().getID()).append(" yet jdk rightfully thinks week is ").append(jdkFormatter.format(time.toDate())).append(" (jdk got it right ?!?!)");

  System.out.println(buffer.toString());
 }
}

Salida:

Testing date 2009-12-06T23:00:00.000+02:00
Joda-Time timezone is Asia/Jerusalem yet joda wrongly thinks week is 49 2009
JDK time zone is Asia/Jerusalem yet jdk rightfully thinks week is 50 2009 (jdk got it right ?!?!)
¿Fue útil?

Solución

La mejor solución disponible es escribir una implementación de DateTimeField que envuelve la lógica para extraer el valor que necesita sobre la base de un escenario. Internamente, es probable que todavía se basan en los datos de JDK. El objetivo es envolver todo el código JDK en una sola clase reutilizable. A continuación se usa de esta manera:

int value = dateTime.get(new LocaleAwareWeekField("en_GB"));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top