C ++确定软件是否在同一天没有打开(Win​​dows)

时间:2015-08-06 13:03:21

标签: c++ windows datetime days

因此,如果我的计划是在我的数据库中存储今天的纪元以来的天数,那么我需要做一些操作。然后,当软件打开时,它将从数据库的最后一个时期开始拉这个天数,然后检查自上一个纪元以来的今天的天数。因此,我将知道这是否是同一天。

我对C ++缺乏经验,而且我一直在查看“stdafx.h”中的DateTime函数,但是我无法获得自上一纪元以来的天数。

所以我这样做的目的是清除数据库,如果这是今天软件第一次打开的话。如果它今天已经打开,那么继续,什么也不做。

我不知道如何在C ++中解决这个问题。如果它是python或C#或java,我会毫不费力。那我怎么用C ++来解决这个问题呢?

2 个答案:

答案 0 :(得分:4)

使用<chrono>标准标题,可以很容易地获得自时钟时代以来的天数。 例如:

#include <chrono>
#include <iostream>

int main() {
    using days = std::chrono::duration<int, std::ratio<24 * 60 * 60>>;

    auto days_since_epoch = std::chrono::duration_cast<days>(std::chrono::system_clock::now().time_since_epoch());

    std::cout << days_since_epoch.count() << "\n";
}

我认为实施可以随意使用任何时代,但如果您只关心连续通话天数的差异,那么您应该没问题。

请注意,由于我们基本上已经完成了一天的开始, 如果您的用户在23:59打开您的应用程序一次,然后在一分钟后再次打开您的应用程序,您将感觉到已经过了一个日历日。

答案 1 :(得分:3)

+1到melak47's answer。我只是想添加(并且这不适合评论),他的答案假定UTC时区的日期变化,这可能就好了。对于许多应用程序来说,这是一个非常好的和有效的答案,包括堆栈溢出本身!

但是如果您希望在本地午夜进行日期更改,here is a library可以帮助您做到这一点,同时仍然坚持使用漂亮的<chrono>设施。事实上,这只是melak47's answer的一个非常小的调整:

#include "tz.h"
#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    using namespace date;

    auto tp = system_clock::now();
    auto lp = current_zone()->to_local(tp);
    auto days_since_epoch = duration_cast<days>(lp.time_since_epoch());
    std::cout << days_since_epoch.count() << "\n";
}

它将给出与melak47's answer完全相同的答案,除非将机器设置为与UTC不同的本地时区,并且UTC当前已经进入第二天,或者仍然在前一天进行比较到当地时区。