2015-09-28 8 views
7

Ho due numeri interi: year e week. Mi piacerebbe costruire un LocalDateTime da questi due valori, in cui la data rappresenta il primo giorno della settimana particolare dell'anno in particolare.Ottieni LocalDateTime in base all'anno e alla settimana dell'anno

ho già provato questo:

LocalDateTime ldt = LocalDateTime.of(year, 1, 1, 0, 0).plusWeeks(week-1); 

Questo non dà il risultato corretto, perché il primo giorno dell'anno, non è sempre l'inizio della prima settimana di quell'anno. Non riesco a capire come ottenere il primo giorno della prima settimana.

C'è un modo semplice per farlo con l'API Date and Time in Java 8?

Nota: so che potrei anche creare una soluzione con le risposte date here, ma questo sembra inverosimile. Forse non è così, fammi sapere!

+0

settimana in un anno è specifico locale, in modo da quelli due punti dati non ti daranno una data esatta. AFAIK 'LocalDateTime' non gestisce questo fatto, ma' GregorianCalendar' fa. – biziclop

+0

@biziclop Penso che sia esattamente quello che vuole. Una settimana specifica per la locale "1" - quindi per alcuni ragazzi la prima settimana di 4 giorni, per gli altri qualcos'altro. – dognose

+0

@dognose Quindi 'GregorianCalendar' è davvero la strada da percorrere. – biziclop

risposta

9

Il seguente codice otterrà un LocalDateTime e impostarlo al primo giorno della data settimana-di-anno per l'anno data:

int week = 1; 
int year = 2016; 
WeekFields weekFields = WeekFields.of(Locale.getDefault()); 
LocalDateTime ldt = LocalDateTime.now() 
          .withYear(year) 
          .with(weekFields.weekOfYear(), week) 
          .with(weekFields.dayOfWeek(), 1); 
System.out.println(ldt); 

Nota che la nozione di week-di-anno è locale specifica. Qui, ho utilizzato le impostazioni internazionali predefinite, ma potrebbe essere necessario utilizzare le impostazioni locali fornite dall'utente.

Se si desidera eliminare la parte relativa all'ora, è possibile aggiungere una chiamata a truncatedTo(ChronoUnit.DAYS).

3

Si potrebbe provare ad analizzare una rappresentazione in formato stringa del giorno che ti interessa:

private static final DateTimeFormatter YEAR_WEEK = DateTimeFormatter.ofPattern("YYYY-w-e", Locale.getDefault()); 

public static LocalDate fromYearWeek(int year, int week) { 
    return LocalDate.parse(year + "-" + week + "-1", YEAR_WEEK); 
} 

Se avete bisogno di un LocalDateTime, è quindi possibile utilizzare localDate.atTime(...) o localDate.atStartOfDay() per esempio.

2
LocalDate ld = LocalDate.parse("2012-W48-1", DateTimeFormatter.ISO_WEEK_DATE); 
+0

Grazie per questa risposta! Penso che sia molto simile alla risposta di assylias e anche un po 'incompleta. Forse potresti modificarlo per spiegare perché è diverso. – bashoogzaad

+0

è simile ma evita la creazione di un'istanza LocalDate aggiuntiva – Vovka

1

ThreeTen-Extra

Il progetto ThreeTen-Extra java.time estende con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. Potresti trovare alcune classi utili come YearWeek.

Se per "settimana" intendevi lo standard ISO 8601 definition of a week-of-year dove la settimana 1 contiene il primo giovedì dell'anno, consenti alla classe YearWeek di fare il lavoro per te.

int weekBasedYear = 2015; // Not the calendar year! 
int weekOfYear = 1; 
YearWeek yearWeek = YearWeek.of (weekBasedYear , weekOfYear); 

È possibile ottenere un valore di sola data rappresentato in un oggetto LocalDate. Specificare quale giorno della settimana si desidera utilizzare l'enum DayOfWeek, dove lunedì è il primo giorno della settimana e domenica è l'ultimo giorno. Ricorda che una settimana ISO inizia sempre il lunedì e termina sempre di domenica.

LocalDate mondayOfYearWeek = yearWeek.atDay (DayOfWeek.MONDAY); 
LocalDate sundayOfYearWeek = yearWeek.atDay (DayOfWeek.SUNDAY); 

Discarica per consolle. Nota come la settimana inizia nel precedente anno solare (2014) e termina nel 2015, perché il 1 gennaio 2015 è un giovedì, quindi segna la settimana ISO 1. La seguente domenica 4 gennaio 2015 si conclude la settimana ISO 1.

System.out.println ("yearWeek: " + yearWeek + " starts on mondayOfYearWeek: " + mondayOfYearWeek + " and ends on sundayOfYearWeek: " + sundayOfYearWeek); 

annoSettimana: 2015-W01 inizia il mondayOfYearWeek: 2014/12/29 e termina il sundayOfYearWeek: numerazione 2015-01-04

+1

, ma è un problema, ma il problema sta usando un'altra dipendenza. Vorrei che API intuitiva venga aggiunta in jdk stessa. –