Domanda

Il seguente codice illustra l'implementazione Joda tempo problematico calcolo settimana. Questo comportamento non è un bug, ma una decisione di progettazione Joda-Time utilizza l'ISO standard di Lunedi alla Domenica settimana. (forse dovrebbe essere un bug?)

Dato una data ho bisogno di calcolare il numero della settimana, questo calcolo deve essere i18n nei natura. Significato deve prendere in considerazione la numerazione corretta settimana in base alle impostazioni internazionali dell'utente.

Il codice demo seguente mostra il calcolo sbagliato Joda-Time e calcolo corretto da parte del JDK, nella domanda si cerca di attaccare con Joda-Time essere una soluzione superiore per la data di manipolazioni. Quindi, dovrei essere la miscelazione dei due librerie di calcolo del tempo? Vorrei ovviamente preferisco non, è presente anche una cosa sicura da fare o dovrei entrare in casi d'angolo (avendo esperienza con data, il calendario lo so per certo che questo è un problema doloroso per Java).

In conclusione: Qual è la raccomandata best-practice per il requisito descritto

Codice Problema dimostrazione

Si prega di vedere questo calendario online che visualizza numeri di settimana per esempio corretto settimana di calcolo.

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());
 }
}

Output:

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 ?!?!)
È stato utile?

Soluzione

La migliore soluzione disponibile è quella di scrivere un'implementazione di DateTimeField che avvolge la logica per estrarre il valore è necessario sulla base di un locale. Internamente, probabilmente ancora contare sui dati JDK. L'obiettivo è quello di avvolgere tutto il codice JDK in una singola classe riutilizzabile. È quindi possibile utilizzare in questo modo:

int value = dateTime.get(new LocaleAwareWeekField("en_GB"));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top