2012-07-05 13 views
6

Utilizzando la libreria NodaTime, come posso calcolare un LocalDate del primo giorno della settimana in base a un numero Settimana e settimana WeekYear.LocalDate da Week and WeekYear

Il contrario di questo:

var date = new LocalDate(2012, 1, 1); 
int weekYear = date.WeekYear;  // 2011 
int weekNr = date.WeekOfWeekYear; // 52 

Qualcosa di simile a questo codice falso:

var newDate = LocalDate.FirstDayFromWeek(weekYear, weekNr); 
+0

Hai controllato questo http://stackoverflow.com/questions/7130948/joda-time-most-recent-week-and- mese ? – V4Vendetta

+1

@ V4Vendetta: Questo è Joda Time, che è molto più ambivalente su come vengono costruite le date. Il tempo di Noda è per lo più annuale/mese/giorno-centrico. Questo non vuol dire che sia impossibile :) –

risposta

8

In primo luogo, si dovrebbe guardare a come costruire il relativo LocalDate - è tutto quello che le informazioni che avete logicamente se hai uno WeekYear e WeekOfWeekYear. È quindi possibile ottenere uno LocalDate da LocalDate con se lo si desidera realmente, ma resterei con LocalDate fino a quando non si è effettivamente , in questo modo si sintetizzano meno informazioni.

Non credo che attualmente rendiamo questo particolarmente semplice, a dire il vero - anche se il motore sottostante supporta calcoli sufficienti che potremmo aggiungere abbastanza facilmente.

Senza alcuna modifica alle API, vorrei suggerire si sarebbe probabilmente meglio fuori con qualcosa di simile:

  • Construct 1 giugno entro l'anno desiderato, che dovrebbe avere lo stesso WeekYear (sto assumendo si sta utilizzando il calendario ISO ...)
  • arrivare alla prima giornata della settimana (date = date.Previous(IsoDayOfWeek.Monday))
  • Calcolare il numero della settimana corrente
  • aggiungere o sottrarre il giusto numero di settimane

Quindi qualcosa di simile:

public static LocalDate LocalDateFromWeekYearAndWeek(int weekYear, 
    int weekOfWeekYear) 
{ 
    LocalDate midYear = new LocalDate(weekYear, 6, 1); 
    LocalDate startOfWeek = midYear.Previous(IsoDayOfWeek.Monday); 
    return startOfWeek.PlusWeeks(weekOfWeekYear - startOfWeek.WeekOfWeekYear); 
} 

Non eccessivamente piacevole o efficiente, ma non troppo male ... se vi trovate a voler fare un sacco di lavoro con WeekOfWeekYear e WeekYear, si prega di alzare le richieste di funzionalità per il tipo di cosa che vuoi fare.

EDIT: Proprio come un aggiornamento, ora supportiamo questo:

LocalDate date = LocalDate.FromWeekYearWeekAndDay(year, week, IsoDayOfWeek.Monday); 
+0

Grazie! Forse creerò una richiesta di funzionalità. Da notare: per comodità nel mio codice ho una struct: 'struct Week {int Year; int WeekNr; } ' –

Problemi correlati