powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Номер недели месяца
25 сообщений из 37, страница 1 из 2
Номер недели месяца
    #34227375
orient
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как определить номер недели месяца, к которой относится текущая дата
...
Рейтинг: 0 / 0
Номер недели месяца
    #34227515
Фотография Хнык
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы вычислить, на какой день недели приходится некоторая дата, можно использовать следующий алгоритм (все деления целочисленные, остаток не учитывается; номер года - Year, месяца - Month, дня - Day)

a= (14-Month)/12
y= Year - a
m= Month + 12a - 2

d= (Day + y + y/4 - y/100 + y/400 + (31*m)/12) mod 7

Значения d - 0 для воскресенья, 1 для понедельника, и т.д.

Он обычный сталевар.
Он делает жесть.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34227787
orient
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужный определить порядковый номер недели в месяце, в среднем в месяце 4-5 недель.
Соответсвено исходя из даты нужно определить на какой неделе месяца эта дата
...
Рейтинг: 0 / 0
Номер недели месяца
    #34227826
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orientМне нужный определить порядковый номер недели в месяце, в среднем в месяце 4-5 недель.
Соответсвено исходя из даты нужно определить на какой неделе месяца эта дата

Если алгоритм приведённый Хнык'ом верен, то можно использовать его, что бы определить день недели для первого числа нужного месяца, а дальше недельки посчитать - дело техники.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34227889
Фотография Хнык
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин. Это стёб был.
Формула такая существует, но пойти можно более лёгким путём.

DateTime dt = new DateTime(10, 10, 10);
int day = dt.Day

Он обычный сталевар.
Он делает жесть.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34227904
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХныкБлин. Это стёб был.
Формула такая существует, но пойти можно более лёгким путём.

DateTime dt = new DateTime(10, 10, 10);
int day = dt.Day

Он обычный сталевар.
Он делает жесть.

Всё равно как получаем день недели для первого числа месяца, а дальше
в цикле от первого числа до искомого считаем недельки. Элементарно !
...
Рейтинг: 0 / 0
Номер недели месяца
    #34227915
Фотография Хнык
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o_O

Маразм.

Он обычный сталевар.
Он делает жесть.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34227953
orient
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо
int x=date.AddDays(1 - date.Day).DayOfWeek - date.DayOfWeek;
x = (date.Day + x) / 7 + 1;
...
Рейтинг: 0 / 0
Номер недели месяца
    #34227978
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, вопрос - а к какому месяцу относится неделя, которая началась в одном месяце, а закончилась в другом?
...
Рейтинг: 0 / 0
Номер недели месяца
    #34228004
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orientВсем спасибо
int x=date.AddDays(1 - date.Day).DayOfWeek - date.DayOfWeek;
x = (date.Day + x) / 7 + 1;

Эээ, ну если у вас неделя это 7 дней с Вс до Вс - то верно.
а если с Пн до Пн - то нет.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34228005
Фотография Хнык
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это неделя посредник.
Она существует вне времени и простанства.
В эту неделю случаются странные, а порою и страшные вещи.
Предсказано, именно в одну из таких недель, Ктулху фтагн.

PS Барыгу не сдам.
PPS Раз всё равно офф, всех с наступающим.

Он обычный сталевар.
Он делает жесть.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34228023
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!хм, вопрос - а к какому месяцу относится неделя, которая началась в одном месяце, а закончилась в другом?

К обоим. Это последняя неделя месяца Х и первая неделя месяца Х + 1.
Логично? Но вот день всегда принадлежит какому то одному месяцу и находится соответственно либо в последней неделе месяца Х либо в первой недели месяца Х + 1.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34228085
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с днями - понятно :)
а с неделями - вопрос имхо спорный
...
Рейтинг: 0 / 0
Номер недели месяца
    #34228101
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!с днями - понятно :)
а с неделями - вопрос имхо спорный
Чё ж там спорить то ?!
К какой недели декабря относится 3 декабря 2006 ?
...
Рейтинг: 0 / 0
Номер недели месяца
    #34228118
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orientВсем спасибо
int x=date.AddDays(1 - date.Day).DayOfWeek - date.DayOfWeek;
x = (date.Day + x) / 7 + 1;

Формула не верна. 31 декабря 2006 согласно ей находится в 6-ой недели декабря.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34229914
gerss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orientКак определить номер недели месяца, к которой относится текущая дата
А не проще ли так:

Код: plaintext
1.
2.
3.
4.
int day = DateTime.Today.Day;
int week = day / 7;
if (day % 7 > 0)
  week += 1;


Это, правда, без учета того, что неделя строго с понедельника по воскресенье. Считается, что неделя начинается 1-го числа каждого месяца.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34231270
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gerss orientКак определить номер недели месяца, к которой относится текущая дата
А не проще ли так:

Код: plaintext
1.
2.
3.
4.
int day = DateTime.Today.Day;
int week = day / 7;
if (day % 7 > 0)
  week += 1;


Это, правда, без учета того, что неделя строго с понедельника по воскресенье. Считается, что неделя начинается 1-го числа каждого месяца.

Нет, не проще. Проще как я сказал - в цикле посчитать.
Как заметил Хнык - маразм. Зато работает - 100%.
А ваше решение работает только если 1 число месяца приходится на понедельник.

Ну так что, где формула ?
Хнык - решение плиз в студию!
...
Рейтинг: 0 / 0
Номер недели месяца
    #34231339
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А пока нет формулы, я напишу ещё одно решение.
Не меньший марзам чем цикл, но тоже работает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            DateTime date = monthCalendar1.SelectionStart;
            int x = 1 - Convert.ToInt32(date.AddDays(1 - date.Day).DayOfWeek);
            if (Convert.ToInt32(date.AddDays(1 - date.Day).DayOfWeek) == 0) x = 6;
            int day = date.Day;
            if (date.AddDays(1 - date.Day).DayOfWeek != DayOfWeek.Monday)
            {
                day += Math.Abs(x);
            }
            int week = day / 7;
            if (day % 7 > 0) week += 1;

-------------------------------------------------------------------------
Скоро может начаться такая борьба за мир, что камня на камне не останется.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34231402
Фотография Хнык
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
            int bufer = (int)dt.DayOfWeek;
            bufer=dt.Day - bufer;
            bufer = bufer - Convert.ToInt32(((double)bufer / 7) * 7);
            bufer = (int)(dt.Day + bufer)/7;
Работает во всех случаях, кроме тех, в которых месяц начинается в понедельник, первого.
Он обычный сталевар.
Он делает жесть.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34231749
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хнык
Код: plaintext
1.
2.
3.
            int bufer = (int)dt.DayOfWeek;
            bufer=dt.Day - bufer;
            bufer = bufer - Convert.ToInt32(((double)bufer / 7) * 7);
            bufer = (int)(dt.Day + bufer)/7;
Работает во всех случаях, кроме тех, в которых месяц начинается в понедельник, первого.
Он обычный сталевар.
Он делает жесть.

Сами то хоть проверяли ?
Вообще ни в каком случае не работает. Увы.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34231945
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Статья из №11 журнала Алгоритм .

По каким-то причинам компания Microsoft не добавила свойство Week к классу DateTime. Никогда не мог понять - почему. Вместо этого они вручили нам пространство имён System.Globalization, заполненное функциональностью для работы с датами с помощью разных классов календарей.
В этом примере я использую класс GregorianCalendar для нахождения номера недели указанной даты.

Код: plaintext
1.
2.
3.
4.
5.
6.
using System.Globalization;
public static int WeekNumber(DateTime date)
{ GregorianCalendar cal = new
GregorianCalendar (GregorianCalendarTypes.
Localized);
return cal.GetWeekOfYear(date, CalendarWeekRule.
FirstFourDayWeek, DayOfWeek.Monday);}

Как видите, это совсем не сложно, если вы знаете, где искать такой функционал.
Подобным же образом можно узнать число недель в году.
Для этого вам нужно знать последний день года, который никогда не будет принадлежать к первой неделе следующего года. Этим днём является 28 декабря.

Вот способ, который даст вам число недель в указанном году.

Код: plaintext
1.
2.
3.
4.
5.
6.
using System.Globalization;
public static int WeeksInYear(int year)
{ GregorianCalendar cal = new GregorianCalendar (
GregorianCalendarTypes.Localized);
return cal.GetWeekOfYear(new DateTime(year, 12, 28),
CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday);}

Теперь немного фокусов.

Допустим, вам нужно узнать число недель между двумядатами. Можно передать в вышеприведенный метод дату и вычесть результат из результата, полученного с помощью другого метода:

Код: plaintext
WeekNumber(dateFrom) – WeekNumber(dateTo) + 1

Но вы получите ошибку, если даты принадлежат разным годам.
Для написания метода, принимающего в качестве параметров две даты и возвращающего число недель между ними, необходимо написать несколько дополнительных строк кода.
Вот метод, который я использую для этих целей. Его просто использовать, но он достаточно сложен для такой непростой задачи. Тем более, я считаю, что такой метод должен быть у класса DateTime.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public static int NumberOfWeeks(DateTime dateFrom,
DateTime dateTo)
{
TimeSpan Span = dateTo.Subtract(dateFrom);
if (Span.Days <= 7)
{
if (dateFrom.DayOfWeek > dateTo.DayOfWeek)
{return 2;}
return 1; }
int Days = Span.Days - 7 + (int)dateFrom.DayOfWeek;
int WeekCount = 1;
int DayCount = 0;
for (WeekCount = 1; DayCount < Days; WeekCount++)
{DayCount += 7;}
return WeekCount;
}

Как вы видите из вышеприведенных примеров, работа с неделями на языке C# не так уж и очевидна.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34232163
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hDrummerСтатья из №11 журнала Алгоритм .

Как видите, это совсем не сложно, если вы знаете, где искать такой функционал.


Как я вижу функция GetWeekOfMonth отсутствует начисто.
Но всё равно спасибо за статью.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34232166
Фотография Хнык
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
M234 Хнык
Код: plaintext
1.
2.
3.
            int bufer = (int)dt.DayOfWeek;
            bufer=dt.Day - bufer;
            bufer = bufer - Convert.ToInt32(((double)bufer / 7) * 7);
            bufer = (int)(dt.Day + bufer)/7;
Работает во всех случаях, кроме тех, в которых месяц начинается в понедельник, первого.
Он обычный сталевар.
Он делает жесть.

Сами то хоть проверяли ?
Вообще ни в каком случае не работает. Увы.
Попробуйте дату задать.
Он обычный сталевар.
Он делает жесть.
...
Рейтинг: 0 / 0
Номер недели месяца
    #34232305
gerss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
M234 gerss orientКак определить номер недели месяца, к которой относится текущая дата
А не проще ли так:

Код: plaintext
1.
2.
3.
4.
int day = DateTime.Today.Day;
int week = day / 7;
if (day % 7 > 0)
  week += 1;


Это, правда, без учета того, что неделя строго с понедельника по воскресенье. Считается, что неделя начинается 1-го числа каждого месяца.

Нет, не проще. Проще как я сказал - в цикле посчитать.
Как заметил Хнык - маразм. Зато работает - 100%.
А ваше решение работает только если 1 число месяца приходится на понедельник.

Ну так что, где формула ?
Хнык - решение плиз в студию!
Ну, я бы сказал, что неделя в месяце начинается 1-го числа и необязательно в понедельник. Тогда:
1-я неделя месяца - 1-7;
2-я - 8-14;
3-я - 15 - 21;
4-я - 22 - 28;
5-я - 29 - 31; (неполная, в феврале невисокосного года не будет совсем, в феврале високосного года - 1 день, при 30 днях в месяце - 2 дня, при 31 - 3)
...
Рейтинг: 0 / 0
Номер недели месяца
    #34234707
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gerss
Ну, я бы сказал, что неделя в месяце начинается 1-го числа и необязательно в понедельник. Тогда:
1-я неделя месяца - 1-7;
2-я - 8-14;
3-я - 15 - 21;
4-я - 22 - 28;
5-я - 29 - 31; (неполная, в феврале невисокосного года не будет совсем, в феврале високосного года - 1 день, при 30 днях в месяце - 2 дня, при 31 - 3)

А я бы сказал, что это число какое-то количество семидневий в месяце и к календарным неделям отношение не имеющее. В Америке календарная неделя начинается и заканчивается в воскресенье, в Европе - в понедельник. В арабских странах - в субботу. Остальное - от лукавого.
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Номер недели месяца
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]