È possibile costruire una data e adeguarlo alla primo giorno della settimana per la prima settimana dell'anno con i seguenti:
int year = 2016;
WeekFields weekFields = WeekFields.ISO;
LocalDate date = LocalDate.now().with(weekFields.weekBasedYear(), year)
.with(weekFields.weekOfWeekBasedYear(), 1)
.with(ChronoField.DAY_OF_WEEK, 1);
Grazie alla JodaStephen 's commento, un altro modo per mettere sarebbe utilizzare la classe IsoFields
.
LocalDate date = LocalDate.now().with(IsoFields.WEEK_BASED_YEAR, year)
.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 1)
.with(ChronoField.DAY_OF_WEEK, 1);
WeekFields.ISO
rappresenta la definizione ISO della settimana:
La definizione ISO-8601, dove una settimana inizia il Lunedi e la prima settimana ha un minimo di 4 giorni.
Lo standard ISO-8601 definisce un sistema di calendario basato su settimane. Utilizza i concetti basati sulla settimana dell'anno e sulla settimana della settimana per suddividere il passaggio dei giorni anziché dell'anno standard/mese/giorno.
Si noti che la prima settimana potrebbe iniziare nell'anno solare precedente. Si noti inoltre che i primi giorni di un anno solare possono essere nell'anno in base alla settimana corrispondente all'anno solare precedente.
Da tale definizione, è possibile ottenere:
weekBasedYear()
rappresenta il campo di settimana a base di anni:
Questo rappresenta il concetto dell 'anno in cui settimane iniziano su una fissa giorno della settimana, ad esempio il lunedì e ogni settimana appartiene esattamente a un anno.
In questo caso, vogliamo impostarlo sull'anno desiderato.
weekOfWeekBasedYear()
rappresenta la settimana di settimana a base di anno
Questo rappresenta il concetto del conte di settimane entro l'anno in cui settimane iniziano un determinato giorno della settimana, come il Lunedi e ogni la settimana appartiene a esattamente un anno.
In questo caso, vogliamo che la prima settimana della settimana a base di anno quindi abbiamo impostato a 1.
ChronoField.DAY_OF_WEEK
che rappresenta il giorno della settimana. In questo caso, vogliamo che il primo giorno della settimana, quindi abbiamo impostato a 1.
Poi, con un tale data, è possibile infatti iterare su tutte le settimane dell'anno chiamando LocalDate.plusWeeks(1)
. La domanda è: quante volte hai bisogno di iterare? Ci possono essere più di 52 settimane in un anno. Ci sono 52 o 53 settimane in un anno basato sulla settimana.
È possibile recuperare il numero di settimane con quanto segue. Chiamare rangeRefinedBy(date)
per recuperare i valori validi del campo della settimana dell'anno per la data specificata e ottenere il massimo.
long maxWeekOfYear = weekFields.weekOfWeekBasedYear().rangeRefinedBy(date).getMaximum();
Vedi anche [i miei esempi] (http://time4j.net/tutorial/appendix.html#x14) per la costruzione di un ISO-week-date in diverse librerie. Anche il vecchio JDK con 'java.util.GregorianCalendar' è apparentemente più semplice perché JSR-310 (java.time-package) non ha qui un semplice metodo factory. –