Как вычислить день недели по дате?
Нашел алгоритм, но не весь, че то там не то помогите
n:=trunc(365.25*y)+trunc(30,6*m)+d-621050;
Result:=n-trunc(n/7)*7+1;
Здравствуйте, Silverj, Вы писали:
S>
S>n:=trunc(365.25*y)+trunc(30,6*m)+d-621050;
S>Result:=n-trunc(n/7)*7+1;
S>
Я ради интереса посмотрел как сделан в Java java.util.Calendar, и понятно, что этот алгоритм сильно упрощен и не учитывает ряд моментов — но кроме Leap Seconds, я не готов сказать каких еще. Очевидные моменты почему он может работать не правильно — 2000-ный год был не высокосный, так как он кратен 1000 и возможно 621050 не правильное число, так как оно зависит от того, что считается нулем для системного времени — в unix это, кажется 1-ое января 1970-го, а в DOS и Windows 1-ое же января но 1980-го. Самое просто выяснить это число экперементально — вроде как для этого кода, досточно любое чилсо соотвествующие 12-ти ночи в любой понедельник
-zork
Здравствуйте, Silverj, Вы писали:
S>Как вычислить день недели по дате?
Учитывает все (получаем n = 0 — воскресенье, 1 — понедельник и т.д.):
#include <iostream.h>
typedef char TDayName[15];
TDayName names[7] = {"воскресенье", "понедельник", "вторник",
"среда", "четверг", "пятница", "суббота"};
void main(void) {
int d, m, y, n;
cout << "dd mm yyyy : ";
cin >> d >> m >> y;
// год начинается с марта
m -= 2;
if (m <= 0) {
m += 12;
y--;
};
// собственно формула
n = (d + (13 * m - 1) / 5 + (y % 100) + (y / 100) / 4
+ (y % 100) / 4 - 2 * (y / 100)) % 7;
// если получается число < 0, то прибавляем 7
if (n < 0) {
n += 7;
};
cout << names[n] << '\n';
};