【问题标题】:Milliseconds since epoch to dateformat C++从纪元到日期格式 C++ 的毫秒数
【发布时间】:2014-03-17 13:17:41
【问题描述】:

我有自纪元(windows/gregorian)以来特定时间的毫秒数,以 long long int 表示,并希望将其转换为人类时间,例如 yy-mm-dd-hh-mm-ss-milli。 (我的平台:Windows 7, 64bit)

不幸的是,到目前为止我发现的所有解决方案都无法处理毫秒(long long int)部分。

【问题讨论】:

  • FileTimeToSystemTime() 似乎非常适合您的问题(除了它处理数百纳秒而不是毫秒,并且取决于您所指的“时代”)。
  • 我使用的是 Windows 7(64 位)

标签: c++ datetime milliseconds gregorian-calendar valueconverter


【解决方案1】:

C++11 API 不完整,只好发明自行车:

    static long getTs() {
        struct timeval tp;
        gettimeofday(&tp, NULL);
        long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
        return ms;
    }

    static string format(long ts,string fmt,int cutBack=0){
        time_t tt = ts/1000;
        int microsec = ts%1000;
        struct std::tm * ptm = std::localtime(&tt);
        string fmtms=std::regex_replace(fmt, std::regex("%ms"), to_string(microsec));
        std::stringstream ss;
        ss << std::put_time(ptm, fmtms.c_str());
        string ret = ss.str();
        return ret.substr(0,ret.size()-cutBack);
    }

    std::cout << CommonUtils::format(CommonUtils::getTs(), "%Y-%m-%dT%H:%M:%S.%ms%Z")<<endl;

给我:2020-01-24T11:55:14.375+07,cutBack 参数是可选的,它指定要从输出字符串中删除多少个字符。当像 +0700 这样的时区格式很长时,它很有用,您只需要 +07。

【讨论】:

    【解决方案2】:

    基本上,您应该能够使用您所拥有的任何东西来写入格式化时间而不是毫秒,并将毫秒数除以 1000 的余数相加。这应该可以工作,因为闰时间始终是一个整数秒数。

    假设 C++11,你可以试试这个:

    #include <chrono>
    #include <iomanip>
    
    using namespace std;
    using namespace chrono;
    
    long long int milliSecondsSinceEpoch = ... // this is your starting point
    const auto durationSinceEpoch = std::chrono::milliseconds(milliSecondsSinceEpoch);
    const time_point<system_clock> tp_after_duration(durationSinceEpoch);
    time_t time_after_duration = system_clock::to_time_t(tp_after_duration);
    
    std::tm* formattedTime = std::localtime(&time_after_duration);
    
    long long int milliseconds_remainder = milliSecondsSinceEpoch % 1000;
    cout <<put_time(std::localtime(&time_after_duration), "%y-%m-%d-%H-%M-%S-") << milliseconds_remainder << endl;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2020-01-11
      • 2011-06-09
      • 2014-10-12
      • 2012-02-19
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多