2015-06-29 4 views
3

Я могу получить номер недели, если я использую обычный способ. Как вы знаете, это вычисляет номер недели в соответствии с обычной датой начала, которая составляет 01.01.2015.Получить номер недели для разных стартов

CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(mydate, CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule, CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek) 

Но я хочу изменить эту дату начала. Например, моя первая неделя года будет 01.07.2015, и по этой дате я хочу рассчитать неделю года для данной даты.

+0

Может быть, посмотри на Нод время http://nodatime.org/. И вы должны знать, что существует международный стандарт, как количество недель. Если вы планируете изобретать свой собственный стандарт, вы будете путаться для тех, кто использует международный стандарт. – RenniePet

ответ

2

Вычтите разницу между новым годом и датой начала с mydate объекта

var startDate = new DateTime(2015, 7, 1); 
var newYear = new DateTime(2015, 1, 1); 

var culture = CultureInfo.CurrentCulture; 
var weekOfYear = culture.Calendar.GetWeekOfYear(
    mydate.Add(newYear - startDate), 
    culture.DateTimeFormat.CalendarWeekRule, 
    culture.DateTimeFormat.FirstDayOfWeek); 
+0

Если вы примените свой код с помощью startDate = Sunday 2015 Nov 1st & mydate = Wednesday 2015 4 ноября, mydate.Add (newYear - startDate) дает воскресенье 2015 4 января. Затем weekOfYear будет 2, в то время как 1 ожидался. – Graffito

+0

@ Graffito Я получаю «1-я неделя»; Это зависит от ваших CalendarWeekRule и FirstDayOfWeek – hazzik

+0

Hazzik: дайте мне правила (CalendarWeekRule и FirstDayOfWeek), которые вы использовали для своего кода, и я отправлю даты, когда возвращаемый результат неверен. – Graffito

-1

Просто вычитайте количество дней между желаемой датой недели и датой начала по умолчанию и используйте это смещение каждый раз при вычислении (.AddDays (offset)).

+0

Не знаю, почему это было опущено. Он объясняет, что работает, но не показывает код. Ответ Hazziks - это реализация моего описания ... – Wolf5

0

Может быть, вы могли бы вычислить номер недели для даты начала (например, 01.07.2015 -), а затем, что номер недели для даты фактического - например 12.12.2015(), а затем просто вычесть - в этом случае ?

-1

Таким образом:

DateTime startDateTime = new DateTime(2015,07,01) ; 
int fisrtDayOfWeek = 0 ; // 0:sunday for US, 1:Monday for many other coutries 
DateTime week1StartDateTime = startDateTime ; 
for (int i=1;i<6;i++) if ((int)startDateTime.AddDays(i).Day==fisrtDayOfWeek) 
    week1StartDateTime = startDateTime.AddDays(i) ; 

int weekNumber= mydate<week1StartDateTime ? 1 : 
    ((int)(mydate-week1StartDateTime).TotalDays)/7+1 ; 
// note : casting double to int provides the floor (not round) 
+0

Понимая, что первый день недели зависит от страны, я обновил свой код соответствующим образом. – Graffito

Смежные вопросы