35
time_t seconds;
time(&seconds);

cout << seconds << endl;

这给了我一个时间戳。我怎样才能把那个纪元日期变成一个字符串?

std::string s = seconds;

不工作

4

9 回答 9

44

试试std::stringstream

#include <string>
#include <sstream>

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

围绕上述技术的一个很好的包装是 Boost's 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().

于 2009-06-15T18:14:39.857 回答
36

如果您想将时间放在可读的字符串中,请尝试以下操作:

#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

于 2009-06-15T18:22:18.643 回答
4

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

请参阅以下示例,按照建议演示 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 在这里找到


#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 找到:这里


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

#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 发现:这里


于 2017-01-28T02:04:14.977 回答
1

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

于 2009-06-15T18:22:25.290 回答
1

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

于 2009-06-15T18:16:44.097 回答
1

C++方式是使用stringstream。

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

 char buf[16];
 snprintf(buf, 16, "%lu", time(NULL));
于 2009-06-15T19:05:43.423 回答
1

这是我的格式化程序——欢迎评论。这个 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;
}
于 2019-02-18T20:34:58.237 回答
0

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

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

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

于 2009-06-15T18:23:18.893 回答
0

localtime 对我不起作用。我使用了 localtime_s:

struct tm buf;
char dateString[26];
time_t time = time(nullptr);
localtime_s(&buf, &time);
asctime_s(dateString, 26, &buf);
于 2018-07-09T11:01:39.207 回答