c++ - 为什么 time() 没有正确更新我的自定义时间?
问题描述
我创建了一个 DateTime 类。如果它是今天的日期,它会给出正确的日期,并且它更新得很好。但是,当我制作自定义日期/时间时,它没有正确更新我的日期。我用一个简单的项目压缩了这个大的 DateTime 类,希望你能编译得很好。要编译它,请使用一个空的 C++ 控制台项目。
我已经为此工作了几天。最初,这个类有它自己的 tm 结构,我把它去掉了。现在该类只存储原始时间。
日期时间.h
#pragma once
#include <iostream>
#include <ctime>
class DateTime
{
private:
time_t m_rawTime;
bool m_customDateTime;
public:
DateTime();
static DateTime now();
void update();
std::string toLongDateString();
std::string toLongTimeString();
void addDate(const time_t rawTimeDifference);
void setDate(const int month, const int day, const int year,
const int hours24 = 0, const int minutes = 0, const int seconds = 0);
};
日期时间.cpp
#include "DateTime.h"
#include <ctime>
#include <iostream>
DateTime::DateTime()
{
time(&m_rawTime);
m_customDateTime = false;
}
DateTime DateTime::now()
{
DateTime dt;
time(&dt.m_rawTime);
dt.m_customDateTime = false;
return dt;
}
void DateTime::update()
{
if (!m_customDateTime)
{
time(&m_rawTime);
}
else
{
time_t diff = difftime(m_rawTime, now().m_rawTime);
addDate(diff);
}
}
std::string DateTime::toLongDateString()
{
char buffer[30];
tm *timeInfo = localtime(&m_rawTime);
strftime(buffer, 30, "%m/%d/%Y", timeInfo);
return std::string(buffer, strlen(buffer));
}
std::string DateTime::toLongTimeString()
{
char buffer[30];
tm *timeInfo = localtime(&m_rawTime);
strftime(buffer, 30, "%r", timeInfo);
return std::string(buffer, strlen(buffer));
}
void DateTime::addDate(const time_t rawTimeDifference)
{
m_rawTime += rawTimeDifference;
}
void DateTime::setDate(const int month, const int day, const int year,
const int hours24, const int minutes, const int seconds)
{
tm *timeInfo = localtime(&m_rawTime);
timeInfo->tm_mon = month - 1;
timeInfo->tm_mday = day;
timeInfo->tm_year = (year - 1900);
timeInfo->tm_hour = hours24;
timeInfo->tm_min = minutes;
timeInfo->tm_sec = seconds;
m_rawTime = mktime(timeInfo);
m_customDateTime = true;
}
主文件
#include "DateTime.h"
#include <iostream>
#include <conio.h>
#include <string>
int main()
{
DateTime dt;
// Set a future custom date
dt.setDate(6, 1, 2019, 5, 0, 0);
// Show the custom time: 06/01/2019 05:00:00 AM
std::cout << dt.toLongDateString() << " " << dt.toLongTimeString() << std::endl;
// Wait for five seconds
std::cout << "Press a key to continue . . . ";
getch();
std::cout << std::endl;
// Update the custom time (add difference to the custom time so it's 5 seconds later)
dt.update();
// I'm getting 07/09/2019 12:58:50 PM
std::cout << dt.toLongDateString() << " " << dt.toLongTimeString() << std::endl;
getch();
return 0;
}
自定义日期为 06/01/2019 05:00:00 AM,并暂停 5 秒,我预计输出为 06/01/2019 05:00:05 AM。
解决方案
发生的情况是您的DateTime::update
函数获取设定日期(06/01/2019 05:00:00 AM)之间的差异now
,然后将该差异再次添加回日期,将其推进到相当长的未来(一个多月6 月 1 日和 4 月 21 日之间的差异。
推荐阅读
- reactjs - Windows 10 上的 npm 相关错误
- javascript - Bootstrap carousel next/prev 方法强制它更快地自动播放
- javascript - WebGL 着色器闪烁
- audiokit - AudioKit,从参考文件创建 eq
- mongodb - 如何在mongodb中更新对象数组
- python - 如何在 Python 中为复杂的 __init__ 使用数据类?
- machine-learning - 区分猫狗的迁移学习实践
- android - 错误:在 Ionic 3 中找不到 org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.60-eap-25
- python - 您必须检查字符串列表并且每个项目都必须比前一个项目长的问题
- r - 当 RHS 上的年份在 LHS 上的年份之后 1-3 年时,Inner_join 两个数据框