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.
然后你可以将6
或12
添加到tm_mon
(不要忘记通过将1添加到tm_year
来处理溢出),然后转换回time_t
和 mktime
如果您想要从给定日期算起 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
试试 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;
}
我有以下代码,用它我得到了今天的日期。我想知道是否可以从这段代码中获得 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.
然后你可以将6
或12
添加到tm_mon
(不要忘记通过将1添加到tm_year
来处理溢出),然后转换回time_t
和 mktime
如果您想要从给定日期算起 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
试试 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;
}