internal static int weekOfYear(int year, int month, int day, Weekday startOfWeek)
{
int firstWeekday = DateTime.firstWeekday(year, 0); // zero based
int lastDayInFirstWeek = 7 - (firstWeekday - startOfWeek.ord);
// special case for first week
if (month == 0 && day <= lastDayInFirstWeek) return 1;
// compute from dayOfYear - lastDayInFirstWeek
int doy = dayOfYear(year, month, day) + 1;
int woy = (doy - lastDayInFirstWeek - 1) / 7;
return woy + 2; // add first week and make one based
}