количество дней между двумя датами?
От: 4mbi3nt http://esud.info
Дата: 03.02.03 20:26
Оценка:
привет всем.
вы не подскажите, как можно определить количество дней между двумя датами?

например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях

//4mbi3nt
esud.info
Re: количество дней между двумя датами?
От: Ёрик  
Дата: 03.02.03 21:58
Оценка:
Здравствуйте, 4mbi3nt, Вы писали:

4>привет всем.

4>вы не подскажите, как можно определить количество дней между двумя датами?

4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях


4>//4mbi3nt


Если в сях, то перевести в FILETIME, вычесть и поделить на количество секунд в днях.
Re[2]: количество дней между двумя датами?
От: 4mbi3nt http://esud.info
Дата: 03.02.03 22:04
Оценка:
Здравствуйте, Ёрик, Вы писали:

Р>Здравствуйте, 4mbi3nt, Вы писали:


4>>привет всем.

4>>вы не подскажите, как можно определить количество дней между двумя датами?

4>>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях


4>>//4mbi3nt


Р>Если в сях, то перевести в FILETIME, вычесть и поделить на количество секунд в днях.


а если я это делаю в COBOLи, где них** нету?
esud.info
Re: количество дней между двумя датами?
От: IT Россия linq2db.com
Дата: 03.02.03 22:07
Оценка:
Здравствуйте, 4mbi3nt, Вы писали:

4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях


DateTime d1 = new DateTime(1984,10,27);
DateTime d2 = new DateTime(1990,2,3);

int days = (d2 - d1).Days;
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: количество дней между двумя датами?
От: Ёрик  
Дата: 03.02.03 22:21
Оценка:
Здравствуйте, 4mbi3nt, Вы писали:

4>Здравствуйте, Ёрик, Вы писали:


Р>>Здравствуйте, 4mbi3nt, Вы писали:


4>>>привет всем.

4>>>вы не подскажите, как можно определить количество дней между двумя датами?

4>>>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях


4>>>//4mbi3nt


Р>>Если в сях, то перевести в FILETIME, вычесть и поделить на количество секунд в днях.


4>а если я это делаю в COBOLи, где них** нету?


О, брат, тебе не повезло — приготовься писать DayOfWeek.cbl =)
C учетом количеств дней в месяцах, с учетом високосного года, с учетом исключения каждые 100 и 400 лет из исключений...
Re: количество дней между двумя датами?
От: bkat  
Дата: 03.02.03 22:26
Оценка:
Здравствуйте, 4mbi3nt, Вы писали:

4>привет всем.

4>вы не подскажите, как можно определить количество дней между двумя датами?

4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях


4>//4mbi3nt



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

Вариант 1 с использованием MFC
Например такой код
CTime t1( 1984, 10, 27, 22, 15, 0 ); // 10:15PM Nov 27, 1984
CTime t2( 1990, 3, 2, 22, 15, 0 );   // 10:15PM   March 2, 1990
CTimeSpan diff = t2 - t1;  // Subtract 2 CTimes
LONG d = diff.GetDays();   //

выдаст тебе, что между 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 );

вычислить разницу между датами в секундах.
Разницу в секундах можно легко перевести в дни.
Re[2]: количество дней между двумя датами?
От: 4mbi3nt http://esud.info
Дата: 03.02.03 22:26
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, 4mbi3nt, Вы писали:


4>>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях


IT>
IT>DateTime d1 = new DateTime(1984,10,27);
IT>DateTime d2 = new DateTime(1990,2,3);

IT>int days = (d2 - d1).Days;
IT>


спасибо, но меня интересует, как зто реализуется на более низком уровни.

я буду очень рад, если бы кто нибудь написал pseudocode алгоритма
esud.info
Re[4]: количество дней между двумя датами?
От: 4mbi3nt http://esud.info
Дата: 03.02.03 22:31
Оценка:
Здравствуйте, Ёрик, Вы писали:

Р>Здравствуйте, 4mbi3nt, Вы писали:


4>>Здравствуйте, Ёрик, Вы писали:


Р>>>Здравствуйте, 4mbi3nt, Вы писали:


4>>>>привет всем.

4>>>>вы не подскажите, как можно определить количество дней между двумя датами?

4>>>>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях


4>>>>//4mbi3nt


Р>>>Если в сях, то перевести в FILETIME, вычесть и поделить на количество секунд в днях.


4>>а если я это делаю в COBOLи, где них** нету?


Р>О, брат, тебе не повезло — приготовься писать DayOfWeek.cbl =)

Р>C учетом количеств дней в месяцах, с учетом високосного года, с учетом исключения каждые 100 и 400 лет из исключений...

вот и я о том
esud.info
Re[5]: количество дней между двумя датами?
От: bkat  
Дата: 03.02.03 22:44
Оценка:
В целом наверное будет легче свести эту задачу к подсчету
разницы между произвольной датой и некой фиксированной (например 1.1.1900).
В целом задача не сложная, но требует аккуратности.
Re[6]: количество дней между двумя датами?
От: Ёрик  
Дата: 03.02.03 23:19
Оценка:
Здравствуйте, bkat, Вы писали:

B>В целом наверное будет легче свести эту задачу к подсчету

B>разницы между произвольной датой и некой фиксированной (например 1.1.1900).
B>В целом задача не сложная, но требует аккуратности.

Ой... не смешите мои тапочки. Без разницы, какая там дата.
Ну ладно, берем разницу в годах. Сколько дней в году? 365. Кроме високосных. Високосные — каждый 4-й год, кроме каждого 100-го года, который не является 400-м (2000-й — високосный). Видимо, это самая сложная часть алгоритма — подсчитать количество високосных лет. Самый тупой способ — вычитать по одному году из максимального из двух дат, пока не получится меньший и проверять на високосность. Дальше — между датой типа месяцы-дни можно уже сразу считать разницу в днях, понадобятся два массива — количество дней в месяцах в високосном и нормальном году (это удобнее, чем обрабатывать февраль отдельно, проще использовать что-то типа
DAYS_IN_MONTH_LEAP_YEAR[nMonth] и DAY_IN_MONTH[nMonth]).
А вообще можно сделать совсем тупо — прибавлять к меньшей дате по дню, пока не получится бОльшая дата — это сработает быстро на любых разумных датах.
Re[3]: количество дней между двумя датами?
От: IT Россия linq2db.com
Дата: 03.02.03 23:30
Оценка: 45 (3)
Здравствуйте, 4mbi3nt, Вы писали:

4>спасибо, но меня интересует, как зто реализуется на более низком уровни.


Ну тогда вот очередное извратство на плюсах:

static int days[12+1] = {
    0,
    31,
    31+ 28,
    31+ 28+ 31,
    31+ 28+ 31+ 30,
    31+ 28+ 31+ 30+ 31,
    31+ 28+ 31+ 30+ 31+ 30,
    31+ 28+ 31+ 30+ 31+ 30+ 31,
    31+ 28+ 31+ 30+ 31+ 30+ 31+ 31,
    31+ 28+ 31+ 30+ 31+ 30+ 31+ 31+ 30,
    31+ 28+ 31+ 30+ 31+ 30+ 31+ 31+ 30+ 31,
    31+ 28+ 31+ 30+ 31+ 30+ 31+ 31+ 30+ 31+ 30,
    31+ 28+ 31+ 30+ 31+ 30+ 31+ 31+ 30+ 31+ 30+ 31
};

static int dayS[12+1] = {
    0,
    31,
    31+ 29,
    31+ 29+ 31,
    31+ 29+ 31+ 30,
    31+ 29+ 31+ 30+ 31,
    31+ 29+ 31+ 30+ 31+ 30,
    31+ 29+ 31+ 30+ 31+ 30+ 31,
    31+ 29+ 31+ 30+ 31+ 30+ 31+ 31,
    31+ 29+ 31+ 30+ 31+ 30+ 31+ 31+ 30,
    31+ 29+ 31+ 30+ 31+ 30+ 31+ 31+ 30+ 31,
    31+ 29+ 31+ 30+ 31+ 30+ 31+ 31+ 30+ 31+ 30,
    31+ 29+ 31+ 30+ 31+ 30+ 31+ 31+ 30+ 31+ 30+ 31
};

bool isLeapYear(int year)
{
    return (year % 4) == 0 && (year % 100) != 0 || (year % 400) == 0;
}

int getDays(int year,int mon,int day)
{
    return year * 365 +
           (year + 3) / 4 - (year + 99) / 100 + (year + 399) / 400 +
           (isLeapYear(year)? dayS: days)[mon-1] + day - 1;
}

void main()
{
    printf("%d",getDays(1990,2,3) - getDays(1984,10,27));
}
Если нам не помогут, то мы тоже никого не пощадим.
Re: количество дней между двумя датами?
От: Аноним  
Дата: 03.02.03 23:59
Оценка: 3 (1)
Здравствуйте, 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;
}
Re: количество дней между двумя датами?
От: ilnar Россия  
Дата: 04.02.03 09:22
Оценка:
Здравствуйте, 4mbi3nt, Вы писали:

4>привет всем.

4>вы не подскажите, как можно определить количество дней между двумя датами?

4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях


4>//4mbi3nt


определи разницу между датами в секундах с помощью функции difftime
потом получи дни с нужным тебе округлением
Re: количество дней между двумя датами?
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 04.02.03 09:59
Оценка: 66 (6)
Здравствуйте, 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;
}
... << RSDN@Home 1.0 beta 5 >>
Re[4]: количество дней между двумя датами?
От: Jenyay http://jenyay.net
Дата: 04.02.03 10:14
Оценка:
Здравствуйте, Ёрик, Вы писали:

Ё>О, брат, тебе не повезло — приготовься писать DayOfWeek.cbl =)

Ё>C учетом количеств дней в месяцах, с учетом високосного года, с учетом исключения каждые 100 и 400 лет из исключений...

Вот что значит делать на века.
... << RSDN@Home 1.0 beta 6 >>
Софт, исходники и фото
Re[2]: количество дней между двумя датами?
От: 4mbi3nt http://esud.info
Дата: 04.02.03 21:32
Оценка: 18 (1)
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Здравствуйте, 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;
ММ>}
ММ>


спасибо!!!

как не странно, работает

//4mbi3nt
esud.info
Re[6]: количество дней между двумя датами?
От: _wqwa США  
Дата: 04.02.03 23:00
Оценка:
Здравствуйте, bkat, Вы писали:

B>В целом наверное будет легче свести эту задачу к подсчету

B>разницы между произвольной датой и некой фиксированной (например 1.1.1900).
Точно . Я когда-то так на С и зашаманил. Причем за фикс. дату взял день, когда это писал. .
Кстати, могу автору топика выслать сырцы на С, если он сможет их как-то применить.
К КОБОЛУ разве внешние либы не подключаются?!
(К стати, я тогда тоже пришел к массивам, описывающим число дней с начала года (и число дней до конца) для каждого месяца.
RSDN@Home
Кто здесь?!
Re[2]: количество дней между двумя датами?
От: m.a.g. Мальта http://dottedmag.net/
Дата: 05.02.03 03:46
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>
ММ>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;
ММ>}
ММ>


А эта вещь учитывает "дырку" в 10 дней при переходе с юлианского на григорианский календари?
... << nn04 13 >> ...
Re: количество дней между двумя датами?
От: OlegO Россия http://www.mediachase.ru
Дата: 05.02.03 08:01
Оценка:
Здравствуйте, 4mbi3nt, Вы писали:

4>привет всем.

4>вы не подскажите, как можно определить количество дней между двумя датами?

4>например две даты 27.10.84 и 03.02.90 и мне надо оприделить разницу в днях


4>//4mbi3nt


Дебаты тут долгие на эту тему, а мне вот сайтик попался Сколько Вам дней?
<< RSDN@Home 1.0 beta 5 >>
С уважением, OlegO.
Re[3]: количество дней между двумя датами?
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 05.02.03 08:35
Оценка: 15 (1)
Здравствуйте, 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
Половинка дня возникает из-за того, что обычные юлианские дни отсчитываются от полудня.
... << RSDN@Home 1.0 beta 5 >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.