2012-07-05 13 views
6

Utilizando la biblioteca NodaTime, ¿cómo puedo calcular un LocalDate del primer día de la semana basado en un número de semana y semana WeekYear.LocalDate from Week and WeekYear

El reverso de esto:

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

Algo así como el código falso:

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

¿verificó esta http://stackoverflow.com/questions/7130948/joda-time-most-recent-week-and- mes? – V4Vendetta

+1

@ V4Vendetta: Eso es Joda Time, que es mucho más ambivalente sobre cómo se construyen las fechas. El tiempo de Noda es principalmente año/mes/día céntrico. Eso no quiere decir que sea imposible :) –

Respuesta

8

En primer lugar, usted debe buscar la manera de construir el correspondiente LocalDate - que es toda la información que tiene, lógicamente, si tienes un WeekYear y WeekOfWeekYear. A continuación, puede obtener un LocalDateTime de LocalDate con AtMidnight si realmente desea, pero me quedaría con LocalDate hasta que realmente necesite cualquier otra cosa, de esa manera estará sintetizando menos información.

No creo que actualmente lo hagamos particularmente sencillo, para ser honesto, aunque el motor subyacente admite suficientes cálculos que podríamos agregar con bastante facilidad.

sin cambios en la API, sugeriría que probablemente sea el mejor fuera con algo como:

  • Constructo 1 ª de junio de en el año deseado, que debe tener el mismo WeekYear (estoy asumiendo que está utilizando el calendario ISO ...)
  • llegar a la primera día de la semana (date = date.Previous(IsoDayOfWeek.Monday))
  • Calcular el número actual semana
  • sumar o restar el número correcto de semana

Así que algo como:

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

No muy agradable y eficiente, pero no demasiado mal ... si usted se encuentra con ganas de hacer un montón de trabajo con WeekOfWeekYear y WeekYear, por favor, levanten las peticiones de características para el tipo de cosas que quieres hacer.

EDIT: Al igual que una actualización, ahora admitimos esto:

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

¡Gracias! Tal vez crearé una solicitud de función. A tener en cuenta: por conveniencia en mi código, tengo una estructura: 'struct Week {int Year; int WeekNr; } ' –