我正在构建一个将在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/