Как получить номер месяца с номера года и недели в С#?
Как говорится в названии, с учетом номера года и недели, как мне получить номер месяца?
edit: если неделя пересекает два месяца, я хочу, чтобы месяц был в первый день недели.
edit (2): Вот как я получаю номер недели:
CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
Я просто пытаюсь сделать обратное.
Ответы
Ответ 1
Вот что я сделал:
static int GetMonth(int Year, int Week)
{
DateTime tDt = new DateTime(Year, 1, 1);
tDt.AddDays((Week - 1) * 7);
for (int i = 0; i <= 365; ++i)
{
int tWeek = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
tDt,
CalendarWeekRule.FirstDay,
DayOfWeek.Monday);
if (tWeek == Week)
return tDt.Month;
tDt = tDt.AddDays(1);
}
return 0;
}
Я бы предпочел что-то более простое, но он работает:)
Ответ 2
Если вы предполагаете, что первый день вашего определения недели будет в тот же день, что и в первый день года, это будет работать:
int year = 2000;
int week = 9;
int month = new DateTime(year, 1, 1).AddDays(7 * (week - 1)).Month;
Очевидно, что истинный ответ будет зависеть от того, как вы определяете первый день недели, и как вы определяете, как неделя попадает в месяц, когда она перекрывает более одного.
Ответ 3
Не будет ли это также зависеть от дня недели?
Ответ 4
Еще одна проблема, с которой вы могли столкнуться, заключается в том, что большинство лет не начинается в начале недели, что сдвигает все.
Ответ 5
это должно помочь
public int getMonth(int weekNum, int year)
{
DateTime Current = new DateTime(year, 1, 1);
System.DayOfWeek StartDOW = Current.DayOfWeek;
int DayOfYear = (weekNum * 7) - 6; //1st day of the week
if (StartDOW != System.DayOfWeek.Sunday) //means that last week of last year month
{
Current = Current.AddDays(7 - (int)Current.DayOfWeek);
}
return Current.AddDays(DayOfYear).Month;
}
Ответ 6
Предположения:
- Воскресенье - первый день недели.
- Частичная неделя по-прежнему считается неделей 1
-
Выводит начало и конец месяца как целочисленный массив.
public int[] getMonth(int weekNum, int year)
{
DateTime StartYear = new DateTime(year, 1, 1);
System.DayOfWeek StartDOW = StartYear.DayOfWeek;
DateTime DayOfYearWeekStart = default(DateTime);
DateTime DayOfYearWeekEnd = default(DateTime);
int x = 0;
if ((StartDOW == System.DayOfWeek.Sunday)) {
DayOfYearWeekStart = StartYear.AddDays((weekNum - 1) * 7);
DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6);
} else {
for (x = 0; x <= 7; x += 1) {
if (StartYear.AddDays(x).DayOfWeek == DayOfWeek.Sunday) {
break; // TODO: might not be correct. Was : Exit For
}
}
if (weekNum == 1) {
DayOfYearWeekStart = StartYear;
DayOfYearWeekEnd = StartYear.AddDays(x - 1);
} else if (weekNum > 1) {
DayOfYearWeekStart = StartYear.AddDays(((weekNum - 2) * 7) + x);
DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6);
}
}
int[] Month = new int[2];
Month[0] = DayOfYearWeekStart.Month;
Month[1] = DayOfYearWeekEnd.Month;
return Month;
}
Ответ 7
Вы не можете. Вам нужен по крайней мере день, когда начнется первая неделя (или когда начнется неделя), чтобы получить точный ответ.
Ответ 8
Вы не можете. Неделя может начинаться через месяц и заканчиваться другим.
Ответ 9
Я думаю, вы предполагаете, что "неделя" - это любая группа из 7 последовательных дней. Это не так. Данный Год (2008), Неделя (5), вы можете быть в январе или феврале, в зависимости от того, когда начнется ваша "неделя".
Ответ 10
// Calculate the week number according to ISO 8601
public static int Iso8601WeekNumber(DateTime dt)
{
return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
// ...
DateTime dt = DateTime.Now;
// Calculate the WeekOfMonth according to ISO 8601
int weekOfMonth = Iso8601WeekNumber(dt) - Iso8601WeekNumber(dt.AddDays(1 - dt.Day)) + 1;