所以我需要做一些动作,如果软件还没有在同一天打开,我的计划是将自今天的纪元以来的天数存储在我的数据库中。 然后,当软件打开时,它将从数据库的上一个纪元拉出这个天数,然后检查自上一纪元以来的天数。 所以我会知道这是不是同一天。
我对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一次打开您的应用程序,然后一分钟后再次打开您的应用程序,您将会看到一个日历日过去了。