powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Количество дней до события
7 сообщений из 32, страница 2 из 2
Количество дней до события
    #35965118
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
? (date(2009, 5, 31)-date()) %365 < 30 && да
? (date(1987, 5, 31)-date()) %365 < 30 && да
? (date(1900, 7, 31)-date()) %365 < 30 && нет
...
Рейтинг: 0 / 0
Количество дней до события
    #35965277
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alextashk? (date(2009, 5, 31)-date()) %365 < 30 && да
? (date(1987, 5, 31)-date()) %365 < 30 && да
? (date(1900, 7, 31)-date()) %365 < 30 && нет
Решение соблазнительно простое. Однако, это решение не учитывает все те же високосные года.

Сегодня - 02.05.2009

Дата - 31.05.1987 - до 2009 было 88, 92, 96, 2000, 04, 08 - 6 високосных лет, когда количество дней в году было не 365, а 366. Это значит, что деление на 365 дает ошибку в 6 дней в сторону увеличения остатка от деления.

Но, поскольку здесь используются отрицательные величины, то произойдет не увеличение, а уменьшение остатка от деления. Т.е. разница будет не 29 дней, как ожидалось, а 23 дня

В данном случае - без разницы. Все равно ведь попали, но если взять даты

Код: plaintext
? (date( 1987 ,  6 ,  6 )-date()) %  365  <  30  && да

Ничего себе! 6 июня отстоит от 2 мая меньше, чем на 30 дней!

К сожалению, использовать в качестве основания вместо 365 значение 365,25 не получится, поскольку в этом случае сложно сказать, каков будет результат округления для интервалов, меньше 4 лет. Поэтом, логично просто рассчитать количество лет (по 365 дней) и поделив это значение на 4 внести поправку.

Код: plaintext
? (date( 1987 ,  6 ,  6 )-date()) %  365  - floor((date( 1987 ,  6 ,  6 )-date()) /  365  /  4 )  <  30  && нет (разница  35  дней)

Почему надо брать ближайшее большее (для отрицательных чисел ближайшее меньшее)? Ну, потому, что если интервал между датами, составляет, например, 5 лет, то в него попало 2 високосных года, а не 1, как получится если взять просто целую часть от деления 5/4.

Если интервал составил ровно 4 года, то в него попал только один високосный год, поскольку считаем "года" состоящие из 365 дней.

Разумеется, этот алгоритм даст ошибку, если интервал дат больше, чем 365 лет. Но, не думаю, что в этом случае кто-то будет определять дату рождения.

В общем, решение простое только на первый взгляд. Если доводить его до завершения, то оно становится не такое уж и простое и далеко не очевидное.
...
Рейтинг: 0 / 0
Количество дней до события
    #35965575
guest12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае - без разницы. Все равно ведь попали, но если взять даты

? (date(1987, 6, 6)-date()) % 365 < 30 && да

Ничего себе! 6 июня отстоит от 2 мая меньше, чем на 30 дней!

? dodobday({^1987.06.06},{^2009.05.02})

35 дней

* здесь меняем год в дате рождения на текущий
d3= LTRIM(STR(YEAR(d2))) + RIGHT(DTOC(d1,1),4)
d3= CTOD('^'+LEFT(d3,4)+'.'+SUBSTR(d3,5,2)+'.'+RIGHT(d3,2))
IF (d3-d2)<0 & проверка событие уже прошло в этом году?
* если да, прибавляем к текущему еще один год
d3= LTRIM(STR(YEAR(d2)+1)) + RIGHT(DTOC(d1,1),4)
d3= CTOD('^'+LEFT(d3,4)+'.'+SUBSTR(d3,5,2)+'.'+RIGHT(d3,2))
ENDIF
* возвращаем разницу дней
RETURN d3-d2

и поскольку используется стандартная операция вычитания из большей даты
меньшую, то и считает все правильно, в том числе и с високосными годами
все в порядке
...
Рейтинг: 0 / 0
Количество дней до события
    #35965932
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,

Да Вы правы, поэтому, с учётом требования найти людей с датами дней рождений, отстоящими от текущей даты, на менее 30 дней можно использовать следующую функцию

? (date(YEAR(DATE()), 5, 31)-date()) %365 < 30 && да
? (date(YEAR(DATE()), 5, 31)-date()) %365 < 30 && да
? (date(YEAR(DATE()), 7, 31)-date()) %365 < 30 && нет
...
Рейтинг: 0 / 0
Количество дней до события
    #35965978
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, я понимаю, "в лом" читать все то, что уже было понаписано на эту тему. Но ведь вы буквально шаг-в-шаг наступаете на все те же грабли, про которые уже было сказано не однократно.

Проблема в формировании значения даты из "слагаемых" заключается в том, что далеко не факт, что в результате получится корректное выражение даты. Возможна ошибка с разными последствиями.

Для примера

Код: plaintext
1.
2.
3.
SET DATE GERMAN
?CTOD("29.02.2001")  && получим пустую дату, поскольку  2001  год не високосный
?Date( 2001 , 2 , 29 )   && получим пустую дату, поскольку  2001  год не високосный

Кроме того, если подставлять в дату значения текущего года, то напарываемся на проблему перехода через год. Это когда день рождения, скажем 31 декабря, а сегодня 1 января. Имеем

Код: plaintext
?(Date( 2009 , 12 , 31 )-Date( 2009 , 1 , 1 )) %  365   &&  364  дня разницы!

Ну, пожалуйста, прежде, чем опять что-то писать, ПРОЧИТАЙТЕ то, что уже обсуждалось до вас. Ведь все это уже БЫЛО.
...
Рейтинг: 0 / 0
Количество дней до события
    #35966439
той
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМРебята, я понимаю, "в лом" читать все то, что уже было понаписано на эту тему. Но ведь вы буквально шаг-в-шаг наступаете на все те же грабли, про которые уже было сказано не однократно.

Проблема в формировании значения даты из "слагаемых" заключается в том, что далеко не факт, что в результате получится корректное выражение даты. Возможна ошибка с разными последствиями.

Для примера

Код: plaintext
1.
2.
3.
SET DATE GERMAN
?CTOD("29.02.2001")  && получим пустую дату, поскольку  2001  год не високосный
?Date( 2001 , 2 , 29 )   && получим пустую дату, поскольку  2001  год не високосный

Кроме того, если подставлять в дату значения текущего года, то напарываемся на проблему перехода через год. Это когда день рождения, скажем 31 декабря, а сегодня 1 января. Имеем

Код: plaintext
?(Date( 2009 , 12 , 31 )-Date( 2009 , 1 , 1 )) %  365   &&  364  дня разницы!

Ну, пожалуйста, прежде, чем опять что-то писать, ПРОЧИТАЙТЕ то, что уже обсуждалось до вас. Ведь все это уже БЫЛО.

С датой 29 февраля действительно проблема, но второй указанный случай, в котором вы противоречите себе, т.к. если дата рождения 31 декабря, а сегодня 1 января, то это
значит что родился он как минимум в прошлом году, а не в текущем, и до его дня рождения
364 дня, все правильно.
...
Рейтинг: 0 / 0
Количество дней до события
    #35966593
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
той
С датой 29 февраля действительно проблема, но второй указанный случай, в котором вы противоречите себе, т.к. если дата рождения 31 декабря, а сегодня 1 января, то это
значит что родился он как минимум в прошлом году, а не в текущем, и до его дня рождения
364 дня, все правильно.
Действительно, забыл, что рассматривается "будущая" дата. Т.е. определяется не просто "интервал", а "направленный интервал". В этом случае, при расчете остатка от деления на 365 проблемы "перехода через год" нет. Но остается проблема високосных лет.
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Количество дней до события
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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