我正在构建一个将在Ubuntu中运行的C++应用程序,并将Sqlite3用作数据库。

我的目标之一是拥有一个包含时间/日期字段的C++类,然后将其存储在数据库中。

过去,我在类上使用time_t作为变量类型,并将它们作为INTEGER类型存储在Sqlite3上,例如:

C++类:

class MyClass {

        time_t dateTimeInfo;
}

Sqlite3:
CREATE TABLE MYCLASS (....., INTEGER DATETIMEINFO, ...);

这种方法使我可以使用不同的比较运算符(SELECT)进行>, >=, < , <=, ==编码,而没有任何问题,因为我正在处理简单数字。在用户级别,time_t转换为ISO 8601 std::string´s,因此我可以拥有一个人类可读的界面。

除了它不支持millisecods 之外,这非常有效。在我当前的项目中,我需要支持他们,因此我需要对此进行更改。

就我所了解的学习而言,我需要使用std::chrono::time_point作为类类型,如下所示:

C++类:
class MyClass {

        std::chrono::time_point dateTimeInfo;
}

但是我真的不知道在Sqlite3中使用哪种数据类型,以及它是否可以像time_t一样使用...

Sqlite3:
CREATE TABLE MYCLASS (....., ???? DATETIMEINFO, ...);

我的问题:

a)std::chrono::time_point在这里正确吗?

b)什么是Sqlite3类型等效项?还是INTEGER

c)这是推荐的方法(请不要使用boost,C++ 11)?

感谢您的帮助。

最佳答案

是的,std::chrono是一种非常好的方法(内部为C++)。您可以使用std::chrono将时间点从/转换为毫秒,如下所示:

using namespace std::chrono;

typedef time_point<system_clock, milliseconds> time_points_millis;

time_points_millis tp = system_clock::now();

// An at least 43 bit signed integral type
auto epoch = tp.time_since_epoch();

在这种情况下,您应该使用64位整数类型将其与SQLite一起存储,因为数据可以超过32位。

注释:到目前为止,我对SQLite的了解并不多,但是我在64位类型official docs中发现了这一点。

关于c++ - C++和Sqlite3:如何以毫秒精度存储日期/时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31248825/

10-11 22:06
查看更多