|
Вопросы о программировании Вопросы, касающиеся программирования на FBD |
|
Опции темы | Поиск в этой теме |
14.08.2019, 14:09 | #1 |
Member
Регистрация: Oct 2018
Сообщения: 78
Благодарил(а): 7 раз(а)
Поблагодарили:
9 раз(а) в 5 сообщениях
|
Почему GetDays "спешит" на 15 дней?
Добрый день коллеги.
Столкнулся с необходимостью хранить дату и вычислять разницу с текущей, логично преобразовать ее в количество дней и хранить как одно число long. И вот тут возникла загвоздка. По описанию функции GetDays выдает количество дней прошедших с 01.01.0001. Есть общепринятый алгоритм расчета дня по Юлианскому и Григорианскому календарю, например такой wiki Если считать по нему 01.01.0001 это 1721426 й день Например сегодня 14.08.2019 это 2458710 й день Разница 737284 дней. GetDays выдает 737300. Ошибка 15 дней? Понятно, что можно эту ошибку учесть и не париться, но хотелось бы понять, откуда она берется, где и когда ждать подвоха. |
14.08.2019, 14:12 | #2 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 117
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: Почему GetDays "спешит" на 15 дней?
Цитата:
Думаю, если бы в этой функции была ошибка, то за несколько десятков лет это хоть кто-то, но заметил. Другими словами, я не проверяя ваши расчёты считаю, что скорее всего вы в чём-то ошиблись или что-то не учли. Високосные года, например. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
14.08.2019, 14:19 | #3 |
Member
Регистрация: Oct 2018
Сообщения: 78
Благодарил(а): 7 раз(а)
Поблагодарили:
9 раз(а) в 5 сообщениях
|
Ответ: Почему GetDays "спешит" на 15 дней?
|
14.08.2019, 14:27 | #4 |
Member
Регистрация: Oct 2018
Сообщения: 78
Благодарил(а): 7 раз(а)
Поблагодарили:
9 раз(а) в 5 сообщениях
|
Ответ: Почему GetDays "спешит" на 15 дней?
не один я ошибаюсь видать....
|
14.08.2019, 14:56 | #5 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 117
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: Почему GetDays "спешит" на 15 дней?
Цитата:
DWORD * ClassLogix::getDays(DWORD * cp, WORD ) struct tm * tinfo = GetLocalTime(); *(pDWORD)(*(cp++)) = DateToDays(tinfo->tm_mday, tinfo->tm_mon + 1, tinfo->tm_year + 1900); ) static int day_tab[12] = {0,31,59,90,120,151,181,212,243,273,304,334}; static unsigned long DateToDays(signed int _day, signed int _month, signed int _year) { unsigned long days; unsigned int quot; unsigned int rem; if(_year <= 0) _year = 2000; if(_month <= 0) _month = 1; if(_month > 12) _month = 12; if(_day <= 0) _day = 1; quot = (_year - 1) / 4; rem = (_year - 1) - quot * 4; days = ((unsigned long)quot * (4 * 365 + 1)) + ((unsigned long)rem * 365); quot = 0; if ((rem == 3) && (_month >= 2)) { if(_month == 2) quot = 1; else days++; } rem = day_tab[_month - 1] + _day; if(_month == 12) quot += 365; else quot += day_tab[_month]; if(rem > quot) days += quot; else days += rem; days %= 766661L; if(days < 730135L) days = 730135L; return days; } __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. Последний раз редактировалось Arsie, 14.08.2019 в 17:29 |
|
14.08.2019, 23:28 | #6 | |
Member
Регистрация: Oct 2018
Сообщения: 78
Благодарил(а): 7 раз(а)
Поблагодарили:
9 раз(а) в 5 сообщениях
|
Ответ: Почему GetDays "спешит" на 15 дней?
Цитата:
PS: По юлианскому календарю.... похоже в этом и трабл |
|