【问题标题】:String representation of time_t?time_t 的字符串表示?
【发布时间】:2009-06-15 18:11:22
【问题描述】:
time_t seconds;
time(&seconds);

cout << seconds << endl;

这给了我一个时间戳。如何将该纪元日期转换为字符串?

std::string s = seconds;

没用

【问题讨论】:

  • 解决方案是多么的困难和耗时,真是令人讨厌。与返回std::string 并采用time_tstring 参数的简单函数不同,第二个是格式定义,有一些解决方案需要超过六行代码。这不是很壮观吗?
  • @ajeh:C++ 是乐高,而不是乐高宇宙飞船。 ;)

标签: c++ timestamp


【解决方案1】:

试试std::stringstream

#include <string>
#include <sstream>

std::stringstream ss;
ss << seconds;
std::string ts = ss.str();

Boost 的lexical_cast 是对上述技术的一个很好的封装:

#include <boost/lexical_cast.hpp>
#include <string>

std::string ts = boost::lexical_cast<std::string>(seconds);

对于这样的问题,我喜欢链接 Herb Sutter 的 The String Formatters of Manor Farm

更新:

对于 C++11,使用 to_string()

【讨论】:

    【解决方案2】:

    如果你想把时间放在可读的字符串中,试试这个:

    #include <ctime>
    
    std::time_t now = std::time(NULL);
    std::tm * ptm = std::localtime(&now);
    char buffer[32];
    // Format: Mo, 15.06.2009 20:20:00
    std::strftime(buffer, 32, "%a, %d.%m.%Y %H:%M:%S", ptm);  
    

    如需进一步参考 strftime(),请查看cppreference.com

    【讨论】:

    • nulldevice,上面我不清楚,但我想要一个纪元日期(时间戳)的字符串表示形式。
    【解决方案3】:

    这里的最佳答案对我不起作用。

    请参阅以下示例,按照建议演示 stringstream 和 lexical_cast 答案:

    #include <iostream>
    #include <sstream>
    
    int main(int argc, char** argv){
     const char *time_details = "2017-01-27 06:35:12";
      struct tm tm;
      strptime(time_details, "%Y-%m-%d %H:%M:%S", &tm);
      time_t t = mktime(&tm); 
      std::stringstream stream;
      stream << t;
      std::cout << t << "/" << stream.str() << std::endl;
    }
    

    输出:1485498912/1485498912 找到here


    #include <boost/lexical_cast.hpp>
    #include <string>
    
    int main(){
        const char *time_details = "2017-01-27 06:35:12";
        struct tm tm;
        strptime(time_details, "%Y-%m-%d %H:%M:%S", &tm);
        time_t t = mktime(&tm); 
        std::string ts = boost::lexical_cast<std::string>(t);
        std::cout << t << "/" << ts << std::endl;
        return 0;
    }
    

    输出:1485498912/1485498912 找到:here


    评分第二高的解决方案在本地工作:

    #include <iostream>
    #include <string>
    #include <ctime>
    
    int main(){
      const char *time_details = "2017-01-27 06:35:12";
      struct tm tm;
      strptime(time_details, "%Y-%m-%d %H:%M:%S", &tm);
      time_t t = mktime(&tm); 
    
      std::tm * ptm = std::localtime(&t);
      char buffer[32];
      std::strftime(buffer, 32, "%Y-%m-%d %H:%M:%S", ptm);
      std::cout << t << "/" << buffer;
    }
    

    输出:1485498912/2017-01-27 06:35:12 找到:here


    【讨论】:

    • 我不明白。您的前两个 sn-ps 显示字符串化工作完美。
    【解决方案4】:

    标准 C++ 本身没有任何时间/日期函数 - 您需要使用 C localtime 和相关函数。

    【讨论】:

    • 您最初的问题是询问如何获取日期,但事实证明您真正想要的是字符串形式的秒数。这有助于准确。
    【解决方案5】:

    函数“ctime()”将时间转换为字符串。 如果要控制其打印方式,请使用“strftime”。但是,strftime() 采用“struct tm”参数。使用“localtime()”将time_t 32位整数转换为struct tm。

    【讨论】:

      【解决方案6】:

      C++的方式是使用stringstream。

      C方式是使用snprintf()来格式化数字:

       char buf[16];
       snprintf(buf, 16, "%lu", time(NULL));
      

      【讨论】:

      【解决方案7】:

      这是我的格式化程序——欢迎使用 cmets。这个 q 似乎最能帮助我找到我的一个所以发布给其他可能正在寻找相同内容的人。

      #include <iostream>
      #include "Parser.h"
      #include <string>
      #include <memory>
      #include <ctime>
      #include <chrono>
      #include <iomanip>
      #include <thread>
      
      using namespace std;
      string to_yyyyMMddHHmmssffffff();
      
      string to_yyyyMMddHHmmssffffff() {
          using namespace std::chrono;
          high_resolution_clock::time_point pointInTime = high_resolution_clock::now();
          std::time_t now_c = std::chrono::system_clock::to_time_t(pointInTime);
          microseconds micros = duration_cast<microseconds>(pointInTime.time_since_epoch());
          std::size_t fractional_microseconds = micros.count() % 1'000'000;
      
          std:stringstream microstream;
          microstream << "00000" << fractional_microseconds;
          string formatted = microstream.str();
          int index = formatted.length() - 6;
          formatted = formatted.substr(index);
          std::stringstream dateStream;
          dateStream << std::put_time(std::localtime(&now_c), "%F %T") << "." << formatted;
          formatted = dateStream.str();
      
          return formatted;
      }
      

      【讨论】:

      • 可能不是最好的函数名,你的代码可以处理一些记录 cmets ......但否则这并不可怕;)
      • 如果重做是真的,我可能会做很多不同的事情。我真正能说的就是今天比昨天更欣赏我的 .net 的 .ToString("yyyy-MM-dd HH:mm:ss.fffffff") 方法。
      【解决方案8】:

      您可能希望以多种方式格式化时间(取决于时区、您希望如何显示时间等),因此您不能简单地将 time_t 隐式转换为字符串。

      C 方式是使用ctime 或使用strftime 加上localtimegmtime

      如果您想要一种更类似于 C++ 的方式来执行转换,您可以研究 Boost.DateTime 库。

      【讨论】:

        【解决方案9】:

        本地时间对我不起作用。我用的是localtime_s:

        struct tm buf;
        char dateString[26];
        time_t time = time(nullptr);
        localtime_s(&buf, &time);
        asctime_s(dateString, 26, &buf);
        

        【讨论】:

          猜你喜欢
          • 2017-04-09
          • 2017-07-19
          • 2016-12-11
          • 2010-09-24
          • 2012-11-30
          • 1970-01-01
          • 2010-12-18
          • 2015-07-13
          • 2021-12-26
          相关资源
          最近更新 更多