首页 > 解决方案 > 为什么 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。

标签: c++

解决方案


发生的情况是您的DateTime::update函数获取设定日期(06/01/2019 05:00:00 AM)之间的差异now,然后将该差异再次添加回日期,将其推进到相当长的未来(一个多月6 月 1 日和 4 月 21 日之间的差异。


推荐阅读