определение количества дней между двумя датами в одном году (c ++)

Я хочу узнать количество дней между двумя месяцами. Я использую XCode, но не хочу испытывать трудности с установкой boost или date.h, поэтому я попытался сделать это более примитивно, но каким-то образом код продолжает ломаться в определенный момент:

    for ( it=mymap.begin() ; it != mymap.end(); it++ ) {
auto nx = next(it);

if (it->second.patientID == nx->second.patientID) {

//31 28 31 30 31 30 31 31 30 31 30 31
yue = it->second.month;
yue2 = nx->second.month;
sincejan1 = 0;
sincejan = 0;

//it keeps breaking at the line below
if (abs(yue-yue2) > 0) {

if (yue ==12)
sincejan1 = 365-31;
if (yue ==11)
sincejan1 = 365-31-30;
if (yue ==10)
sincejan1 = 365-31-30-31;
if (yue ==9)
sincejan1 = 365-31-30-31-30;
if (yue ==8)
sincejan1 = 31+28+31+30+31+30+31+31;
if (yue ==7)
sincejan1 = 31+28+31+30+31+30+31;
if (yue ==6)
sincejan1 = 31+28+31+30+31+30;
if (yue ==5)
sincejan1 = 31+28+31+30+31;
if (yue ==4)
sincejan1 = 31+28+31+30;
if (yue ==3)
sincejan1 = 31+28+31;
if (yue ==2)
sincejan1 = 31+28;
if (yue ==1)
sincejan1 = 31;

if (yue2 ==12)
sincejan = 365-31;
if (yue2 ==11)
sincejan = 365-31-30;
if (yue2 ==10)
sincejan = 365-31-30-31;
if (yue2 ==9)
sincejan = 365-31-30-31-30;
if (yue2 ==8)
sincejan = 31+28+31+30+31+30+31+31;
if (yue2 ==7)
sincejan = 31+28+31+30+31+30+31;
if (yue2 ==6)
sincejan = 31+28+31+30+31+30;
if (yue2 ==5)
sincejan = 31+28+31+30+31;
if (yue2 ==4)
sincejan = 31+28+31+30;
if (yue2 ==3)
sincejan = 31+28+31;
if (yue2 ==2)
sincejan = 31+28;
if (yue2 ==1)
sincejan = 31;
}

monthDiff = sincejan1 - sincejan;
}
}

Я не уверен, что не так, или если это хороший способ сделать это. Буду очень признателен за любую помощь / совет! Я начинающий программист.

3

Решение

Это похоже на вопрос об интервью, который я задаю потенциальным сотрудникам для написания кода для меня. (А в целях оценки интервью им не разрешается использовать встроенные функции даты / времени).

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

Для начала нам нужна простая функция, которая сообщает нам, является ли год, с которым мы имеем дело, високосным, потому что в какой-то момент кода нам придется иметь дело с високосными годами. И високосный год немного больше, чем просто «каждые четыре года». Но вы уже знаете это.

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

Нам понадобится еще одна вспомогательная функция, которая возвращает число дней в месяце, и она должна учитывать високосные годы в феврале.

int getDaysInMonth(int month, int year)
{
int days_in_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

int result = days_in_month[month-1];
if ((month == 2) && isLeapYear(year))
{
result++;
}
return result;
}

Предположим, что в приведенном выше коде «январь» будет представлен как «месяц == 1», а декабрь «месяц == 12». Следовательно, [месяц-1] вещь в поиске массива. Мы добавили бы некоторые параметры проверки в приведенный выше код, но это должно работать в целях обсуждения.

Теперь у нас есть способ подсчета дней в месяце, нам нужна функция, которая сообщит нам «сколько дней с начала года» для данного месяца / дня / года.

int getDayOfYear(int month, int day, int year)
{
int count = 0;
int m = 1;

while (m != month)
{
count += getDaysInMonth(m, year);
m++;
}
count += day - 1;
return count;
}

Вышеприведенная функция вернет «0» для (1,1,2015) и «364» для (12,31,2015). Опять же, для производственного кода потребуется проверка параметров.

Теперь вычислим разницу в днях между любыми двумя днями одного и того же года:

int getDiffOfDaysInSameYear(int month1, int day1, int month2, int day2, int year)
{
int day_of_year1 = getDayOfYear(month1, day1, year);
int day_of_year2 = getDayOfYear(month2, day2, year);
return day_of_year2 - day_of_year1;
}

Давайте проверим это:

int main()
{
int x = getDiffOfDaysInSameYear(4,4, 10,24, 2015); // number of days to get to  10/24/2015 from 4/4/2015
printf("The delta in days between April 4 and October 2015 is: %d days\n", x);
return 0;
}

Распечатывает: The delta in days between April 4 and October 2015 is: 203 days

Если вы хотите упростить подсчет дней между месяцами, просто введите «1» для этих дней.

int main()
{
int x = getDiffOfDaysInSameYear(5, 1, 11, 1, 2015);
printf("The delta in days between May and November is %d\n", x);
return 0;
}

Распечатывает: The delta in days between May and November is 184

Надеюсь это поможет.

1

Другие решения

Я бы порекомендовал использовать «difftime»:

http://www.manpagez.com/man/3/difftime/

ДОПОЛНЕНИЕ:

Я думал, что попробую какой-нибудь пример кода на Eclipse / CDT … но моя установка CDT не работала 🙁 Я закончил переустановку.

ТЕМ НЕ МЕНИЕ:

datediff.c:

#include <stdio.h>   /* printf() etc */
#include <time.h>    /* time(), difftime(), time_t, struct tm */
#include <stdlib.h>  /* atoi() */

#define SECONDS_IN_DAY (60 * 60 * 24) /* Note importance of parentheses */

int
datediff(int m1, int m2) {
double diff_seconds;
int diff_days;

/* Populate timeptr structs */
time_t now = time(NULL);
struct tm *tm_ptr = gmtime(&now);
struct tm t1 = *tm_ptr, t2 = *tm_ptr;
t1.tm_mon = m1;
t2.tm_mon = m2;

/* Compute difference between m1 and m2 */
diff_seconds = difftime(mktime(&t1), mktime(&t2));
diff_days = diff_seconds / SECONDS_IN_DAY;
if (diff_days < 0) diff_days = -diff_days;
return diff_days;
}

int
main (int argc,char *argv[]) {
/* Input: month1, month2 */
if (argc != 3) {
printf ("USAGE: datediff m1 m2\n");
return 1;
}

/* Compare dates */
printf ("#/months= %d\n", datediff(atoi(argv[1]), atoi(argv[2])));

/* Exit */
return 0;
}

Образец вывода:

./datediff 9 1
#/months= 242

./datediff 1 9
#/months= 242

./datediff 9 8

./datediff 9 8
#/months= 30

./datediff 3 2
#/months= 31
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector