3

我需要计算给定日期的天数。一年有 366 天。然而,每个月都有不同的价值,我必须分配这些价值。有没有比我现在做的更快的方法?

#include<iostream>
using namespace std;
int main()
{
   int day, month, year, dayNumber;

   cout<< "Please enter the month, by numerical value:";
   cin>> month;
   cout<<"Please enter the day, by numerical value:";
   cin>> day;
   cout<<"Please enter the year, by numerical value:";
   cin>> year;
   if (month == 1)
   {
      dayNumber= day;
      cout<< "Month;" << '\t'<< month << '\n'
          << "Day:"<<'\t'<< day<< '\n'
          << "Year:"<<'\t'<< year<<'\n'
          << "Day Number:"<< '\t'<< dayNumber<< endl;
   }
   else if(month==2)
   {
      dayNumber= day+31; 
   }
}
4

7 回答 7

6

只需使用mktime

tm date = {};
date.tm_year = year - 1900;
date.tm_mon = month - 1;
date.tm_mday = day;
mktime( &date );
dayNumber = date.tm_yday;

否则,您将需要一个二维表:

int daysToMonth[2][12] =
{
    { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 },
    { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 },
};

和一个功能:

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

当年的一天是:

daysToMonth[isLeapYear( year ) ? 1 : 0][month] + day;
于 2013-10-01T08:15:57.133 回答
4

首先你需要知道这一年是否是闰年:

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

然后,您可以为给定的年份和数组或每月的天数创建:

unsigned int daysPerMonth[] = {31, (isLeap(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

我只给你一些代码,但它们可能会对你有所帮助。

循环遍历这个数组以获得真实的天数。例如 1989 年 4 月 4 日,不是闰年。它是天数 31+28+31(一月到三月)然后 +4。

于 2013-10-01T07:52:21.267 回答
2

在许多方面,最好避免手动滚动。

使用提升:

#include <boost/date_time/gregorian/gregorian.hpp>

//...
try {
    boost::gregorian::date d(year, month, day);
    dayNumber = d.day_of_year();
}
catch (std::out_of_range& e) {
    // Alternatively catch bad_year etc exceptions.
    std::cout << "Bad date: " << e.what() << std::endl;
}

正如 James Kanze 建议的那样,您还可以使用 mktime 来避免对 boost 的依赖(未经测试):

  tm timeinfo = {};
  timeinfo.tm_year = year - 1900;
  timeinfo.tm_mon = month - 1;
  timeinfo.tm_mday = day;
  mktime(&timeinfo);
  dayNumber = timeinfo.tm_yday;
于 2013-10-01T08:10:35.463 回答
1

您可以将每月的天数存储在数组中:

int days_per_month[] = {31, 29, 31, ...};

或者

std::array<int, 12> days_per_month{{31, 29, 31,...}};

然后,您需要遍历该数组以计算已过去天数的总和:

int sum = 0;
for ( int i = 1; i < month; ++i )
{
    sum += days_per_month[i - 1]; // note the index shift!
}
dayNumber += sum;

另一种选择是将总和直接存储在数组中:

std::array<int, 12> passed_days{{0, 31, 60,...}};

然后你摆脱循环:

dayNumber += passed_days[month - 1];

对于闰年,只需检查年份以及月份是否至少为 3。

于 2013-10-01T07:54:34.970 回答
1

您可以创建一个包含每个月的天数的向量:

std::vector<int> days_in_month;
days_in_month.push_back(31); //Jan
days_in_month.push_back(29); //Feb
... // so on for each month

然后,要计算,你可以这样做:

int day = <day_entered_by_user>;
int month = <month_entered_by_user>;

int num_of_days = 0;
// Sum the number of days for all months preceding the current month
for(int i = 0; i < (month - 1); ++i)
  num_of_days += days_in_month[i];

// Finally just add the day entered for the current month
num_of_days += day;
于 2013-10-01T07:51:29.903 回答
0

非常短的代码如下所示:

{
    int nonleap[12]={0,31, 31+28, 31+28+31, 31+28+31+30 .....};
    int leap[12]={0,31, 31+29, 31+29+31, 31+29+31+30 .....};

    if(yearIsLeap(year))
       return leap[month]+day;
    else
       return nonleap[month]+day;
}
于 2013-10-01T07:53:16.667 回答
0

你们让这变得非常困难,为什么不把前两个答案卷起来

int year = 2020, month = 12, day = 10;

tm timeinfo = {};
int dayNumber = 0;

bool isLeap = (((year % 4) == 0) && (((year % 100) != 0) || ((year % 400) == 0));

timeinfo.tm_year = year - 1900;
timeinfo.tm_mon = month - 1;
timeinfo.tm_mday = day;
mktime(&timeinfo);
dayNumber = timeinfo.tm_yday;
if (isLeap && month > 2) dayNumber++;
于 2020-12-10T14:01:29.733 回答