c++qtdatetimeqdatetime

QDateTime::toSecsSinceEpoch() seems not to work


Some theory first:

According to the Qt Documentation the QDateTime::toSecsFromEpoch() function:

Returns the datetime as the number of seconds that have passed since 1970-01-01T00:00:00.000, Coordinated Universal Time.

and:

[...] for all valid dates, this function returns a unique value.

Here is the link to this specific function's description in Qt docs.

My implementation

Here are a few lines of code that are trying to utilize the capabilities of this function:

#include <QtCore>
#include <iostream>

int main()
{
    QDateTime* time = new QDateTime(QDateTime::currentDateTime());

    QString secs1 = QString::number(time->toSecsSinceEpoch());
    std::cout << secs1.toStdString() << std::endl;

    std::this_thread::sleep_for(std::chrono::milliseconds(10000));

    QString secs2 = QString::number(time->toSecsSinceEpoch());
    std::cout << secs2.toStdString();
}

Now, the secs1 and secs2 variables should contain different values, yet this is not the case... Here is the output of the program:

1601491247
1601491247

After waiting ten seconds the value of the secs2 should be different. I have no idea why it is not.

Can it be the case that the QDateTime object was initialized the wrong way? Or might it be some system dependent error? I've searched information related to my problem and found nothing. Please help.


Solution

  • QDateTime doesn't continually update. It stores a particular date and time. So no matter how long you wait, it will always give you the same value. To fix your code, you could do something like this:

        QDateTime time1 = QDateTime::currentDateTime();
        QString secs1 = QString::number(time1.toSecsSinceEpoch());
        std::cout << secs1.toStdString() << std::endl;
    
        std::this_thread::sleep_for(std::chrono::milliseconds(10000));
    
        QDateTime time2 = QDateTime::currentDateTime();
        QString secs2 = QString::number(time2.toSecsSinceEpoch());
        std::cout << secs2.toStdString();