web-dev-qa-db-ja.com

time_tの文字列表現?

time_t seconds;
time(&seconds);

cout << seconds << endl;

これにより、タイムスタンプが取得されます。そのエポック日付を文字列に取得するにはどうすればよいですか?

std::string s = seconds;

動作しません

28
g33kz0r

_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);
_

そして、このような質問のために、私は Manor FarmのString Formatters by Herb Sutterをリンクするのが好きです。

更新:

C++ 11では、 to_string() を使用します。

37
Fred Larson

読みやすい文字列で時間を取りたい場合は、これを試してください。

#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 を参照してください。

27
nulldevice

ここでの一番の答えは私にはうまくいきません。

提案されている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 Found 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検出: ここ


2番目に高い評価のソリューションはローカルで機能します。

#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検出: ここ


3
Mo Morsi

C++の方法は、stringstreamを使用することです。

Cの方法は、snprintf()を使用して数値をフォーマットすることです。

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

標準C++には独自の時刻/日付関数はありません-C localtime および関連する関数を使用する必要があります。

1
anon

関数「ctime()」は時刻を文字列に変換します。印刷方法を制御する場合は、「strftime」を使用します。ただし、strftime()は「struct tm」の引数を取ります。 "localtime()"を使用して、time_t 32ビット整数を構造体tmに変換します。

1
Matthias Wandel

ここに私のフォーマッターがあります-コメントを歓迎します。この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;
}

時間をフォーマットする方法は無数にあり(タイムゾーン、表示方法などによって異なります)、time_tを暗黙的に文字列に変換することはできません。

Cの方法は、 ctime を使用するか、 strftime に加えて localtime または gmtime を使用することです。

変換を実行するC++風の方法が必要な場合は、 Boost.DateTime ライブラリを調べることができます。

0
Josh Kelley

現地時間は私のために動作しませんでした。 localtime_sを使用しました:

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