【问题标题】:boost last_write_time is back one hourboost last_write_time 又回来了一小时
【发布时间】:2018-08-07 05:17:55
【问题描述】:

我正在尝试解决以下代码的错误,在该错误中,我与 boost last_write_time 有一个小时的差异。

为了更好地解释它:我创建一个文件,然后尝试使用 boost::filesystem::path 提取它的创建时间。

void PrintTime(boost::filesystem::path _file) {
    time_t sys_time{ last_write_time(_file) };
    ptime p_time{ boost::posix_time::from_time_t(sys_time) };
    boost::posix_time::time_duration time_dur{ p_time.time_of_day() };

    long h{ time_dur.hours() }; //1a
    long m{ time_dur.minutes() };
    long s{ time_dur.seconds() };

    //...print h, m, s.
    }

    //1a: Here when for example the time I expect is 12:34:56,
    //I always get 11:34:56

知道为什么吗? boost last_write_time 中是否有时区? 当我通过系统检查文件时,我的操作系统显示正确的时间。

【问题讨论】:

    标签: boost time boost-filesystem


    【解决方案1】:

    您必须转换为“演示文稿”时区,例如“当 [您] 通过系统检查文件时”。来自文件系统的时间戳是 UTC 时间。

    例如如果你这样做了

    std::cout << boost::posix_time::second_clock::local_time() << "\n";
    std::cout << boost::posix_time::second_clock::universal_time() << "\n";
    

    你可能会得到

    2018-Feb-27 16:03:12
    2018-Feb-27 15:03:12
    

    修复:

    #include <boost/date_time/c_local_time_adjustor.hpp>
    
    void PrintTime(boost::filesystem::path _file) {
        using boost::posix_time::ptime;
        using adj = boost::date_time::c_local_adjustor<ptime>;
    
        time_t const sys_time = last_write_time(_file);
        ptime const utc       = boost::posix_time::from_time_t(sys_time);
        ptime const local     = adj::utc_to_local(utc);
    

    演示

    Live On Coliru

    #include <boost/filesystem.hpp>
    #include <boost/date_time/posix_time/posix_time_io.hpp>
    #include <boost/date_time/posix_time/conversion.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    #include <boost/date_time/c_local_time_adjustor.hpp>
    
    void PrintTime(boost::filesystem::path _file) {
        using boost::posix_time::ptime;
        using adj = boost::date_time::c_local_adjustor<ptime>;
    
        time_t const sys_time = last_write_time(_file);
        ptime const utc       = boost::posix_time::from_time_t(sys_time);
        ptime const local     = adj::utc_to_local(utc);
    
        std::cout << "utc: " << utc << "\n";
        std::cout << "local: " << local << "\n";
        {
            long h{ local.time_of_day().hours() };
            long m{ local.time_of_day().minutes() };
            long s{ local.time_of_day().seconds() };
    
            //...print h, m, s.
            std::cout << h << ":" << m << ":" << s << '\n';
        }
    }
    
    int main() {
        PrintTime("main.cpp");
    }
    

    打印(在我的系统上):

    utc: 2018-Feb-27 15:19:45
    local: 2018-Feb-27 16:19:45
    16:19:45
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2013-11-16
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多