【问题标题】:Convert SQLite Date Field to C++ Time_T将 SQLite 日期字段转换为 C++ Time_T
【发布时间】:2013-07-03 19:38:24
【问题描述】:

如何将以下格式的 SQLite 日期转换为 C++ Time_T 变量?

YYYY-MM-DD HH:MM:SS

【问题讨论】:

    标签: c++ sqlite date time-t


    【解决方案1】:

    您可能希望阅读this question,其中讨论了一些方法。特别是,如果您有权访问 Boost,则可以使用 <boost/date_time/posix_time/posix_time.hpp> 并从问题中格式的字符串创建 boost::posix_time::ptime 对象。 (请参阅该问题的第一个答案。)

    或者,您可以使用strptime()

    例子:

    #include <ctime>
    #include <iostream>
    
    std::size_t timestamp_to_seconds(const char* timestamp)
    {
        std::tm tm_struct;
    
        strptime(timestamp, "%Y-%m-%d %H:%M:%S", &tm_struct);
        // You can control daylight savings time if necessary.
        tm_struct.tm_isdst = 1;
        std::size_t t = std::mktime(&tm_struct);
    
        return t;
    }
    
    int main()
    {
        std::cout << timestamp_to_seconds("2013-07-05 12:34:56") << std::endl;
    
        return 0;
    }
    

    运行此示例会给出以下输出:

    $ ./a.out
    1373042096
    $ date -d "2013-07-05 12:34:56" +%s
    1373042096
    

    如您所见,它与date 实用程序一致。 (我假设您在一个可以访问strptime 的平台上。)在处理夏令时或时区信息时您可能必须小心...我不得不使用tm_struct.tm_isdst = 1 来强制识别夏令时并与@达成一致987654331@.

    【讨论】:

    • C++ 是否有更好的日期时间类型函数我对这门语言非常陌生,time_t 是我发现的第一件事。我尝试使用 boost 库,但是在尝试使用它时出现很多编译错误。不知道是图书馆还是我不了解。
    • 嗨 Talon06,请参阅我的编辑以获取简短示例。希望您可以修改它以适合您的确切目的。
    【解决方案2】:

    time_t 是 Unix 时间戳(自 1970-01-01 以来的秒数),因此您必须使用 strftime 进行转换:

    SELECT strftime('%s', '2013-07-05 12:34:56');
    

    结果是一个字符串,但您可以将其读取为整数值。

    【讨论】:

    • 是否有在应用程序中执行此操作,或者我需要查询该数据库?
    • 首先以time_t 格式将日期存储在数据库中可能是个好主意。如果您真的想在程序中转换它们,请参阅 RyanMck 的回答。
    • 是的,有点不清楚转换是应该通过 C++ 还是 SQLite 进行。当然,SQLite 转换更容易。
    猜你喜欢
    • 2016-11-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多