C ++中的即将到来的日期

Coming dates in C++

我有以下代码,用它我得到了今天的日期。我想知道是否可以从这段代码中获得 6 个月和 12 个月后的日期。或者我怎样才能得到这些日期?

谢谢!

#include <iostream>
#include <ctime>

using namespace std;

int main() {
    time_t hoy = time(0);
    char* fecha = ctime(&hoy);
    
    cout << "La fecha es: " << fecha << endl;
}

我尝试制作一个程序,用户可以用它来计划某些植物的施肥期等,这就是为什么我尝试让程序打印下一个 6 个月和 12 个月的日期,从今天开始 (好吧,从用户注册植物的那一天开始)。到目前为止我还没有成功。 :(

由于您似乎只需要粗略估计您的用例的未来日期,您可以简单地假设每个月大约有 30.4 天,并计算其中的秒数未来基于此。然后,您可以使用 ctime() 为该未来时间生成新的日期字符串:

#include <stdio.h>
#include <time.h>

int main(int argc, const char ** argv)
{
   const time_t now = time(NULL);

   // Assuming every month has ~30.4 days; that's not really true
   // but it's close enough for plant fertilization purposes, I think
   const time_t ROUGHLY_ONE_MONTH_IN_SECONDS = (30*24*60*60) + (10*60*60);

   for (int i=0; i<=12; i++)
   {
      const time_t then = (now+(i*ROUGHLY_ONE_MONTH_IN_SECONDS));
      printf("In %i months, the approximate date/time will be:  %s", i, ctime(&then));
   }

   return 0;
}

请注意,对于 准确 的答案,您需要考虑不同的月份长度,加上闰年和天知道其他什么,以及在那种情况下,您最好改用现代 date/time 库。

我会用 struct tm and convert your time_t using gmtime.

然后你可以将612添加到tm_mon(不要忘记通过将1添加到tm_year来处理溢出),然后转换回time_tmktime

如果您想要从给定日期算起 6 个月,计算月份而不是天数,解决方案是拆分日期并手动增加月份和年份。然后你还必须调整年换行和月换行。

这些函数在 C89/C99 中定义,因此不特定于 Posix。

此解决方案的最大优点是您不必 link 针对任何外部库。您的编译器应该可以在 Linux、Mac 甚至 Windows/MS Visual Studio.

上使用
#include <time.h>
#include <stdint.h>
#include <stdio.h>

time_t add_months( time_t from_date, uint32_t months ) {
    // Split date
    struct tm* tmptr = ::gmtime( &from_date );
    if ( tmptr == nullptr ) return 0;
    struct tm date = *tmptr;

    // Save original date
    struct tm org = date;

    // Add months/years
    uint32_t years = months/12;
    months = months % 12;
    date.tm_year += years;
    date.tm_mon += months;

    // Correct for year wrap
    if ( date.tm_mon>11 ) { 
        date.tm_mon -= 12;
        date.tm_year += 1;
    }

    // Convert back to time_t
    time_t dt = mktime( &date );

    // Check for end of month wrap
    // eg Jan/30 -> Mar/02 -> Feb/28
    if ( date.tm_mday != org.tm_mday ) {
        dt -= date.tm_mday * 86400;
    }
    return dt;
}

int main() {
    time_t now = time(nullptr);
    time_t later = add_months( now, 6 );

    struct tm* tmptr = ::gmtime( &now );
    if ( tmptr!=nullptr ) {
        printf( "Now: %s\n", asctime(tmptr));
    }
    tmptr = ::gmtime( &later );
    if ( tmptr!=nullptr ) {
        printf( "Later: %s\n", asctime(tmptr));
    }
}

结果:

Program stdout
Now: Thu Jan  6 01:47:07 2022
Later: Wed Jul  6 01:47:07 2022

神马:https://godbolt.org/z/vE4xhsP3E

试试 Boost 日期时间库?简单易用,不用学习时间换算什么的,专注于自己想做的事情。

#include "boost/date_time/gregorian/gregorian.hpp"
#include <iostream>
#include <string>

int
main(int argc, char* argv[])
{

    using namespace boost::gregorian;

    try {
        //Read ISO Standard(CCYYMMDD) and output ISO Extended
        std::string ud("20011009"); //2001-Oct-09
        date d1(from_undelimited_string(ud));
        std::cout << "date is="<<to_iso_extended_string(d1) << std::endl;
        {
            boost::gregorian::months monthObj(6);
            date d2(d1 + monthObj);
            std::cout << "date  6 month later is=" << to_iso_extended_string(d2) << std::endl;
        }
        {
            boost::gregorian::months monthObj(12);
            date d2(d1 + monthObj);
            std::cout << "date  12 month later is=" << to_iso_extended_string(d2) << std::endl;
        }
    }
    catch (std::exception& e) {
        std::cout << "  Exception: " << e.what() << std::endl;
    }


    return 0;
}