计算当前日期和用户输入日期故障之间的天数

时间:2017-04-13 02:47:25

标签: c++

该计划的主要目标是能够向用户询问日期,例如他们的生日,然后输出他们活着的天数。

所以我在这里遇到的主要问题是试图找出如何制作它以便程序知道一个月和一年中有多少天。

我要求用户提供当前日期,月份和年份的数字格式(例如1 1 2000)

现在当你从BetweenYear,BetweenDay和betweenMonth之间添加结果时,它只给我大约40天,具体取决于我放入的年份,实际上应该是成千上万。我知道这是因为当询问用户这个信息时,程序不知道这些是实际日期,而是它们只是数字。我不知道如何获取用户信息并将其转换为程序中的实际日期而不是简单的整数

所以我的问题是:如何在仍然使用用户输入的数字的同时定义一个月中的天数和一年中的天数。

我只输入了我认为必要的代码部分。 (我对此仍然很陌生,而且我一直在进行大量的研究,但是找不到足以让我理解的例子是不成功的。)

int main()
{
     cout << "Please Enter the day you were born. (EX 1-31) ";
     cin >> day;

     cout << "Please Enter the month you were born. (EX 1-12) ";
     cin >> month;

     cout << "Please Enter the year you were born. (EX 1990)";
     cin >> year;

     time_t t = time(NULL);
     tm* timePtr = localtime(&t);

     betweenYear = (timePtr->tm_year + 1900) - year;
     betweenDay = timePtr->tm_mday - day;
     betweenMonth = timePtr->tm_mon - month;

2 个答案:

答案 0 :(得分:1)

我建议使用标准库来处理与时间相关的问题。

#include <ctime>

using namespace std;

const long long SECONDS_PER_DAY = 3600L * 24L;

long long days_since(int year, int month, int day) {
    // Current time since epoch
    time_t now = time(nullptr);

    // Convert year, month and day to a tm object
    tm beg = *localtime(&now);
    beg.tm_year = year - 1900;
    beg.tm_mon = month - 1;
    beg.tm_mday = day;

    // difftime returns seconds
    time_t bd = mktime(&beg);
    return static_cast<long long>(difftime(now, bd))/SECONDS_PER_DAY;
}

答案 1 :(得分:0)

您需要将这些年份扩展为几天以及几个月,所以通常只需将年份扩展为365 * betweenYear,并且每年闰年都需要额外添加一天所以像(365*betweenYear)+((betweenYear-(betweenYear%4))/4)之类的东西,几个月试着让你的想法循环使用它们并使用类似days += (month_number-(month_number <= 7 ? 1 : 0)) % 2 && month_number != 2 ? 30 : month_number == 2 ? year_number % 4 == 0 ? 29 : 28 : 31;的东西。

以下是扩展形式的三元组:

int tmp_month = month_number;
if (month_number <= 7) {
    tmp_month -= 1;
}
if (tmp_month % 2 && month_number != 2) {
    days += 30;
} else if (month_number == 2) {
    if (year_number % 4 == 0) {
        days += 29;
    } else {
        days += 28;
    }
} else {
    days += 31;
}