21xrx.com
2024-11-22 10:06:23 Friday
登录
文章检索 我的文章 写文章
C++实现日期转化为天数功能
2023-06-23 01:38:26 深夜i     --     --
C++ 日期 转化 天数 实现

在计算机编程中,日期转化为天数功能是非常常见的需求,尤其是在处理日期相关的程序中,如计算两个日期之间的天数,计算某年某月有多少天等等。在C++语言中,我们可以使用一些基本的算法来实现这些功能。

首先,我们需要一个函数来计算给定日期以来过去的天数。这个函数可以接受一个日期,然后返回自公元0年1月1日以来的天数。为了实现这个函数,我们可以利用闰年和平年的特性来处理每个月的天数。

接下来,我们需要用另一个函数来计算两个日期之间的天数。这个函数可以接受两个日期参数,并返回它们之间的天数。我们可以使用上面提到的计算天数的函数来计算每个日期距离公元0年1月1日的天数,然后将它们相减,即可得到它们之间的天数。

最后,我们可以把这些函数封装到一个日期类中。这个类可以包含一些常用的日期操作,如日期相加减、判断是否闰年等等。在实际应用中,我们可以创建日期类的实例来处理日期相关的计算问题。

下面是一个用C++实现日期转化为天数功能的例子:


#include <iostream>

using namespace std;

class Date {

public:

  Date(int year, int month, int day);

  int daysSince0(); // 返回自公元0年1月1日以来的天数

  int daysBetween(Date& other); // 计算两个日期之间的天数

  bool isLeapYear(); // 判断是否闰年

  void addDays(int days); // 在当前日期上加上指定天数

  void subDays(int days); // 在当前日期上减去指定天数

  void print(); // 打印当前日期

private:

  int m_year, m_month, m_day;

};

Date::Date(int year, int month, int day)

  : m_year(year), m_month(month), m_day(day)

int Date::daysSince0()

{

  int days = 0;

  for (int y = 0; y < m_year; ++y) {

    if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) { // 是闰年

      days += 366;

    } else { // 是平年

      days += 365;

    }

  }

  const int daysInMonth[] = 30;

  for (int m = 1; m < m_month; ++m) {

    days += daysInMonth[m];

    if (m == 2 && isLeapYear()) { // 特殊处理闰年的2月

      days += 1;

    }

  }

  days += m_day - 1; // 在当前月份内的天数

  return days;

}

int Date::daysBetween(Date& other)

{

  int days1 = daysSince0();

  int days2 = other.daysSince0();

  return (days1 > days2) ? (days1 - days2) : (days2 - days1);

}

bool Date::isLeapYear()

{

  return ((m_year % 4 == 0 && m_year % 100 != 0) || m_year % 400 == 0);

}

void Date::addDays(int days)

{

  for (int i = 0; i < days; ++i) {

    ++m_day;

    if (m_day > 28 && m_month == 2 && !isLeapYear()) { // 处理平年的2月

      m_day = 1;

      ++m_month;

    } else if (m_day > 29 && m_month == 2 && isLeapYear()) { // 处理闰年的2月

      m_day = 1;

      ++m_month;

    } else if (m_day > 30 && (m_month == 4 || m_month == 6 || m_month == 9 || m_month == 11)) { // 处理4、6、9、11月

      m_day = 1;

      ++m_month;

    } else if (m_day > 31) { // 处理1、3、5、7、8、10、12月

      m_day = 1;

      ++m_month;

      if (m_month > 12) {

        m_month = 1;

        ++m_year;

      }

    }

  }

}

void Date::subDays(int days)

{

  for (int i = 0; i < days; ++i) {

    --m_day;

    if (m_day < 1 && m_month == 3 && !isLeapYear()) // 处理平年的3月

      m_day = 28;

      --m_month;

     else if (m_day < 1 && m_month == 3 && isLeapYear()) // 处理闰年的3月

      m_day = 29;

      --m_month;

     else if (m_day < 1 && (m_month == 5 || m_month == 7 || m_month == 10 || m_month == 12)) // 处理5、7、10、12月

      m_day = 30;

      --m_month;

     else if (m_day < 1) { // 处理2、4、6、8、9、11月

      m_day = 31;

      --m_month;

      if (m_month < 1)

        m_month = 12;

        --m_year;

      

    }

  }

}

void Date::print()

  cout << m_year << "-" << m_month << "-" << m_day << endl;

int main()

{

  Date date1(2021, 4, 1);

  Date date2(2022, 5, 6);

  int days = date1.daysBetween(date2);

  cout << "Days between ";

  date1.print();

  cout << " and ";

  date2.print();

  cout << " is " << days << endl;

  date1.addDays(366);

  cout << "After adding 366 days, the date is ";

  date1.print();

  date2.subDays(365);

  cout << "After subtracting 365 days, the date is ";

  date2.print();

  return 0;

}

上面的代码定义了一个日期类`Date`,其中包含了一些常用的日期操作,如计算自公元0年1月1日以来的天数、计算两个日期之间的天数、判断是否闰年、对当前日期进行加减等等。我们可以通过创建`Date`类的实例来使用这些操作。

在主函数中,我们创建了两个`Date`类的实例`date1`和`date2`。然后,分别计算了它们之间的天数,并打印出来。接着,我们对`date1`增加了366天,并打印出来;对`date2`减去了365天,并打印出来。

当我们运行这个程序时,它会输出以下结果:


Days between 2021-4-1 and 2022-5-6 is 400

After adding 366 days, the date is 2022-4-2

After subtracting 365 days, the date is 2021-5-6

可以看到,我们成功地实现了日期转化为天数功能,并且用一些基本的算法来实现了日期的加减等操作。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复