我有一个运行24*7的后端进程,主要使用c++构建,我需要验证输入日期(YYYYMMDD格式)是否属于接下来的5个工作日。输入日期不是当前日期的明确指示符,因此我使用以下函数获取当前日期,然后从中计算接下来的5个工作日。
const std::string& CurrentDateStr() {
static const std::string sDate = []() {
time_t currTime = time(NULL);
struct tm timeinfo;
localtime_r(&currTime, &timeinfo);
char buffer[16]="";
strftime(buffer, sizeof(buffer), "%Y%m%d", &timeinfo);
return std::string(buffer);
} ();
return sDate;
}
如果流程是今天开始的,那么这个函数返回正确的当前日期,但是如果流程继续运行到明天,那么它将返回昨天的日期作为当前日期,因为从当前日期开始计算未来5个工作日的结果是错误的。
这是预期的吗?是否有一些解决方法,或者是否有更好的方法来实现使用标准c++
的需求您的问题是静态变量。你应该仔细研究一下,因为你会经常遇到它。这就是评论试图让你做的。您可以通过删除它来解决问题:
const std::string& CurrentDateStr() {
time_t currTime = time(NULL);
struct tm timeinfo;
localtime_r(&currTime, &timeinfo);
char buffer[16]="";
strftime(buffer, sizeof(buffer), "%Y%m%d", &timeinfo);
return std::string(buffer);
}
对于更现代的解决方案,正如评论中建议的那样,请阅读chrono。特别是system_clock::现在()。
一种方法是使用chrono:
#include <iostream>
#include <ctime>
#include <chrono>
#include <thread>
int main()
{
while (true)
{
theTime currentTime = time(nullptr);
tm* date = gmtime(¤tTime);
// Print the date and time
std::cout << "Current date and time: " << date->theDay << "/" << date->theMon + 1 << "/" << date->theYear + 1900;
std::cout << " " << date->theHour << ":" << date->theMmin << ":" << date->theSec << std::endl;
// Wait for 1 minute
std::this_thread::sleep_for(std::chrono::minutes(1));
}
}
或使用sleep方法
#include <iostream>
#include <ctime>
#include <unistd.h>
int main()
{
while (true)
{
time_t currentTime = time(nullptr);
tm* date = gmtime(¤tTime);
std::cout << "Current date and time: " << date->tm_mday << "/" << date->tm_mon + 1 << "/" << date->tm_year + 1900;
std::cout << " " << date->tm_hour << ":" << date->tm_min << std::endl;
// Wait for 1 minute (60 seconds)
sleep(60);
}
}