LINUX.ORG.RU

История изменений

Исправление crutch_master, (текущая версия) :

Нужно таймштамп первого числа месяца преобразовать в число дней, прошедшее с 1970 (разделить нацело на 60*60*24), потом найти остаток от 7 и прибавить его к 4, а потом опять найти остаток от 7. Это и будет день недели первого месяца. Потом найти такое же число дней для первого числа следующего месяца и вычислить длину месяца.
Хотя можно даже без таких плясок.
День недели (weekDay 1 - понедельник, 7 - воскресенье) даст date +%u --date="01-01-2020 00:00:00".
Кол-во дней (monthLen) даст date +%d --date="@$(( $(date +%s --date="2020-02-01 00:00:00") - 1))"
Следующий месяц = остаток деления номера текущего месяца на 12 плюс 1.
Кол-во рабочих дней - кол-во полных недель (fullWeeks) * 5 + остаток недели в начале месяца (firstWeek) + остаток недели в конце месяца (lastWeek)
Считаем полные недели (кроме первой): fullWeeks = (monthLen - (8 - weekDay)) / 7 (нацело)
Считаем раб.дни в первой недели: firstWeek = 5 - (weekDay - 1). Считаем нулём, если получилось меньше ноля (weekDay == 1).
Тоже самое для последней недели: lastWeek = monthLen - (fullWeeks * 7) - (8 - weekDay (длинна первой недели). Если больше 5, то равна пяти.
Всё складываем.
Серьёзно не тестил, не уверен, что нужны ветвления в вычислениях раб.дней первой/последней недели, но с ними, в любом случае, будет понятнее.

Исходная версия crutch_master, :

Нужно таймштамп первого числа месяца преобразовать в число дней, прошедшее с 1970 (разделить нацело на 60*60*24), потом найти остаток от 7 и прибавить его к 4, а потом опять найти остаток от 7. Это и будет день недели первого месяца. Потом найти такое же число дней для первого числа следующего месяца и вычислить длину месяца.
Хотя можно даже без таких плясок.
День недели (weekDay 1 - понедельник, 7 - воскресенье) даст date +%u --date="01-01-2020 00:00:00".
Кол-во дней (monthLen) даст date +%d --date="@$(( $(date +%s --date="2020-02-01 00:00:00") - 1))"
Кол-во рабочих дней - кол-во полных недель (fullWeeks) * 5 + остаток недели в начале месяца (firstWeek) + остаток недели в конце месяца (lastWeek)
Считаем полные недели (кроме первой): fullWeeks = (monthLen - (8 - weekDay)) / 7 (нацело)
Считаем раб.дни в первой недели: firstWeek = 5 - (weekDay - 1). Считаем нулём, если получилось меньше ноля (weekDay == 1).
Тоже самое для последней недели: lastWeek = monthLen - (fullWeeks * 7) - (8 - weekDay (длинна первой недели). Если больше 5, то равна пяти.
Всё складываем.
Серьёзно не тестил, не уверен, что нужны ветвления в вычислениях раб.дней первой/последней недели, но с ними, в любом случае, будет понятнее.