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

所以我需要做一些动作,如果软件还没有在同一天打开,我的计划是将自今天的纪元以来的天数存储在我的数据库中。 然后,当软件打开时,它将从数据库的上一个纪元拉出这个天数,然后检查自上一纪元以来的天数。 所以我会知道这是不是同一天。

我对C ++非常不熟悉,而且我一直在看“stdafx.h”中的DateTime函数,但是我一直无法得到自上一个纪元以来的天数。

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

我不知道如何在C ++中去解决这个问题。 如果是Python或C#或Java我会没有这个麻烦。 那么我怎样才能在C ++中去解决这个问题呢?

+1给melak47的回答 。 我只是想添加(这不适合在评论中),他的答案假定UTC时区的一天变化,这可能是正确的。 这对许多应用程序来说是一个非常好的和有效的答案,包括堆栈溢出本身!

但是,如果你想在当地午夜发生一天的变化, 这里有一个图书馆 ,可以帮助你做到这一点,而仍然坚持与漂亮的<chrono>设施。 事实上,这只是对melak47的答案的一个微小的调整:

 #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"; } 

除了当机器设置为与UTC不同的本地时区时,它将给出和melak47的答案完全相同的答案 ,并且与当地时区相比,UTC当前已经到了第二天,或者还在前一天。

使用<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一次打开您的应用程序,然后一分钟后再次打开您的应用程序,您将会看到一个日历日过去了。