Здравствуйте, 4mbi3nt, Вы писали:
4>привет всем. 4>вы не подскажите, как можно определить количество дней между двумя датами?
4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
4>//4mbi3nt
Если в сях, то перевести в FILETIME, вычесть и поделить на количество секунд в днях.
Здравствуйте, Ёрик, Вы писали:
Р>Здравствуйте, 4mbi3nt, Вы писали:
4>>привет всем. 4>>вы не подскажите, как можно определить количество дней между двумя датами?
4>>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
4>>//4mbi3nt
Р>Если в сях, то перевести в FILETIME, вычесть и поделить на количество секунд в днях.
Здравствуйте, 4mbi3nt, Вы писали:
4>Здравствуйте, Ёрик, Вы писали:
Р>>Здравствуйте, 4mbi3nt, Вы писали:
4>>>привет всем. 4>>>вы не подскажите, как можно определить количество дней между двумя датами?
4>>>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
4>>>//4mbi3nt
Р>>Если в сях, то перевести в FILETIME, вычесть и поделить на количество секунд в днях.
4>а если я это делаю в COBOLи, где них** нету?
О, брат, тебе не повезло — приготовься писать DayOfWeek.cbl =)
C учетом количеств дней в месяцах, с учетом високосного года, с учетом исключения каждые 100 и 400 лет из исключений...
Здравствуйте, 4mbi3nt, Вы писали:
4>привет всем. 4>вы не подскажите, как можно определить количество дней между двумя датами?
4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
4>//4mbi3nt
Предлагаю 2 варианта, которые сами по себе алгоритмами не являются,
но позволяют решить твою задачу и могут дать тебе идею самого алгоритма.
выдаст тебе, что между 27.10.84 и 03.02.90 1952 дня.
Вариант 2 с использванием стандартной сишной библиотеки.
В time.h ты можешь найти структуру
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */int tm_min; /* minutes after the hour - [0,59] */int tm_hour; /* hours since midnight - [0,23] */int tm_mday; /* day of the month - [1,31] */int tm_mon; /* months since January - [0,11] */int tm_year; /* years since 1900 */int tm_wday; /* days since Sunday - [0,6] */int tm_yday; /* days since January 1 - [0,365] */int tm_isdst; /* daylight savings time flag */
};
которую ты можешь заполнить своими датами и с помощью функции
time_t mktime( struct tm *timeptr );
вычислить разницу между датами в секундах.
Разницу в секундах можно легко перевести в дни.
Здравствуйте, Ёрик, Вы писали:
Р>Здравствуйте, 4mbi3nt, Вы писали:
4>>Здравствуйте, Ёрик, Вы писали:
Р>>>Здравствуйте, 4mbi3nt, Вы писали:
4>>>>привет всем. 4>>>>вы не подскажите, как можно определить количество дней между двумя датами?
4>>>>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
4>>>>//4mbi3nt
Р>>>Если в сях, то перевести в FILETIME, вычесть и поделить на количество секунд в днях.
4>>а если я это делаю в COBOLи, где них** нету?
Р>О, брат, тебе не повезло — приготовься писать DayOfWeek.cbl =) Р>C учетом количеств дней в месяцах, с учетом високосного года, с учетом исключения каждые 100 и 400 лет из исключений...
В целом наверное будет легче свести эту задачу к подсчету
разницы между произвольной датой и некой фиксированной (например 1.1.1900).
В целом задача не сложная, но требует аккуратности.
Здравствуйте, bkat, Вы писали:
B>В целом наверное будет легче свести эту задачу к подсчету B>разницы между произвольной датой и некой фиксированной (например 1.1.1900). B>В целом задача не сложная, но требует аккуратности.
Ой... не смешите мои тапочки. Без разницы, какая там дата.
Ну ладно, берем разницу в годах. Сколько дней в году? 365. Кроме високосных. Високосные — каждый 4-й год, кроме каждого 100-го года, который не является 400-м (2000-й — високосный). Видимо, это самая сложная часть алгоритма — подсчитать количество високосных лет. Самый тупой способ — вычитать по одному году из максимального из двух дат, пока не получится меньший и проверять на високосность. Дальше — между датой типа месяцы-дни можно уже сразу считать разницу в днях, понадобятся два массива — количество дней в месяцах в високосном и нормальном году (это удобнее, чем обрабатывать февраль отдельно, проще использовать что-то типа
DAYS_IN_MONTH_LEAP_YEAR[nMonth] и DAY_IN_MONTH[nMonth]).
А вообще можно сделать совсем тупо — прибавлять к меньшей дате по дню, пока не получится бОльшая дата — это сработает быстро на любых разумных датах.
Здравствуйте, 4mbi3nt, Вы писали:
4>привет всем. 4>вы не подскажите, как можно определить количество дней между двумя датами?
4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
4>//4mbi3nt
Или вот еще вариантик:
get_days принимает дату, а возвращает кол-во дней от р.х. 0 если ошибка.
/* is leap year */int isleap(int y)
{
if (y % 400 == 0) return 1;
if (y % 100 == 0) return 0;
if (y % 4 == 0) return 1;
return 0;
}
/* date string parser. returns number of days */int get_days
(
int d, /* 1 - <max of month> */int m, /* 1 - 12 */int y /* 1 - unlim */
)
{
int n;
int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
/* m == month of year */
/* d == day of month */
/* y == year */if (m == 2)
{
/* FEB */if (d > (days[m-1] + isleap(y))) return 0;
} else
{
if (d > days[m-1]) return 0;
}
n = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400 + d;
if (m>=3)
{
n += isleap(y);
}
while (m>1)
{
n += days[--m];
}
return n;
}
Здравствуйте, 4mbi3nt, Вы писали:
4>привет всем. 4>вы не подскажите, как можно определить количество дней между двумя датами?
4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
4>//4mbi3nt
определи разницу между датами в секундах с помощью функции difftime
потом получи дни с нужным тебе округлением
Здравствуйте, 4mbi3nt, Вы писали:
4>привет всем. 4>вы не подскажите, как можно определить количество дней между двумя датами? 4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
Можно перевести обе даты в юлианские дни и потом вычесть из второй первую.
Юлианские дни (юлианские даты) — система непрерывной нумерации дней. Юлианский день равен числу суток прошедших с гринвичского полудня (12:00 GMT) 1 января 4713 г. до нашей эры до заданного момента.
int JulianDay(int d, int m, int y)
{
return ( 1461 * ( y + 4800 + ( m - 14 ) / 12)) / 4 +
( 367 * ( m - 2 - 12 * (( m - 14 ) / 12))) / 12 -
3 * (( y + 4900 + ( m - 14 ) / 12) / 100) / 4 + d - 32075;
}
Здравствуйте, Ёрик, Вы писали:
Ё>О, брат, тебе не повезло — приготовься писать DayOfWeek.cbl =) Ё>C учетом количеств дней в месяцах, с учетом високосного года, с учетом исключения каждые 100 и 400 лет из исключений...
Здравствуйте, Михаил Можаев, Вы писали:
ММ>Здравствуйте, 4mbi3nt, Вы писали:
4>>привет всем. 4>>вы не подскажите, как можно определить количество дней между двумя датами? 4>>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
ММ>Можно перевести обе даты в юлианские дни и потом вычесть из второй первую. ММ>
Юлианские дни (юлианские даты) — система непрерывной нумерации дней. Юлианский день равен числу суток прошедших с гринвичского полудня (12:00 GMT) 1 января 4713 г. до нашей эры до заданного момента.
ММ>
ММ>int JulianDay(int d, int m, int y)
ММ>{
ММ> return ( 1461 * ( y + 4800 + ( m - 14 ) / 12)) / 4 +
ММ> ( 367 * ( m - 2 - 12 * (( m - 14 ) / 12))) / 12 -
ММ> 3 * (( y + 4900 + ( m - 14 ) / 12) / 100) / 4 + d - 32075;
ММ>}
ММ>
Здравствуйте, bkat, Вы писали:
B>В целом наверное будет легче свести эту задачу к подсчету B>разницы между произвольной датой и некой фиксированной (например 1.1.1900).
Точно . Я когда-то так на С и зашаманил. Причем за фикс. дату взял день, когда это писал. .
Кстати, могу автору топика выслать сырцы на С, если он сможет их как-то применить.
К КОБОЛУ разве внешние либы не подключаются?!
(К стати, я тогда тоже пришел к массивам, описывающим число дней с начала года (и число дней до конца) для каждого месяца.
Здравствуйте, 4mbi3nt, Вы писали:
4>привет всем. 4>вы не подскажите, как можно определить количество дней между двумя датами?
4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях
4>//4mbi3nt
Дебаты тут долгие на эту тему, а мне вот сайтик попался Сколько Вам дней?
Здравствуйте, m.a.g., Вы писали:
MAG>А эта вещь учитывает "дырку" в 10 дней при переходе с юлианского на григорианский календари?
Нет, только грегорианскую систему (т.е. начиная с 15.10.1582).
Чтобы учитывалась дырка, можно взять следующую функцию. Она считает модифицированный юлианский день, причем с учетом перехода от юлианской к грегорианской системе.
int MJD(int day, int month, int year)
{
double ycor = 0;
if (year <= 0)
ycor = 0.75;
if (month <= 2)
{
--year;
month += 12;
}
int b = 0;
if (((year * 10000) + (month * 100) + day) >= 15821015)
{
int a = year / 100;
b = 2 - a + (a / 4);
}
int yn = (365.25 * year) - ycor;
return floor(yn + (30.6001 * (month + 1)) + day + b - 679006);
}
Модифицированный юлианский день связан с юлианским днем соотношением
MJD = JD-2400000.5
Половинка дня возникает из-за того, что обычные юлианские дни отсчитываются от полудня.