使用std :: chrono在C ++中输出日期和时间

时间:2013-06-20 20:23:47

标签: c++ date c++11 time chrono

我一直在升级一些旧代码,并且尽可能地尝试更新到c ++ 11。以下代码是我用来在程序中显示时间和日期的方式

#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>

const std::string return_current_time_and_date() const
{
    time_t now = time(0);
    struct tm tstruct;
    char buf[80];
    tstruct = *localtime(&now);
    strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
    return buf;
}

我想使用std :: chrono(或类似的)以类似的格式输出当前时间和日期,但我不确定如何这样做。任何帮助将不胜感激。感谢

6 个答案:

答案 0 :(得分:80)

<chrono>库仅处理时间而非日期,但能够将其时间点转换为system_clock的{​​{1}}除外。因此,使用time_t作为日期不会有太大改善。希望在不久的将来我们会得到像chrono::date这样的东西。

也就是说,您可以通过以下方式使用<chrono>

<chrono>

请注意,#include <chrono> // chrono::system_clock #include <ctime> // localtime #include <sstream> // stringstream #include <iomanip> // put_time #include <string> // string std::string return_current_time_and_date() { auto now = std::chrono::system_clock::now(); auto in_time_t = std::chrono::system_clock::to_time_t(now); std::stringstream ss; ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); return ss.str(); } 可能会导致数据争用。您的平台上可能会提供std::localtime或类似功能。

更新

使用新版本的Howard Hinnant date library,你可以写:

localtime_r

这将打印出类似“2015-07-24 05:15:34.043473124 UTC”的内容。


在一个不相关的注释中,使用C ++ 11返回#include "date.h" #include <chrono> #include <string> #include <sstream> std::string return_current_time_and_date() { auto now = std::chrono::system_clock::now(); auto today = date::floor<days>(now); std::stringstream ss; ss << today << ' ' << date::make_time(now - today) << " UTC"; return ss.str(); } 个对象已经不合需要了。 const返回值无法移动。我还删除了尾随const,因为尾随const仅对成员函数有效,并且此函数不需要是成员。

答案 1 :(得分:5)

一个例子:

#include <iostream>
#include <chrono>
#include <ctime>

std::string getTimeStr(){
    std::time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());

    std::string s(30, '\0');
    std::strftime(&s[0], s.size(), "%Y-%m-%d %H:%M:%S", std::localtime(&now));
    return s;
}
int main(){

    std::cout<<getTimeStr()<<std::endl;
    return 0;

}

输出如下:

enter image description here

答案 2 :(得分:2)

bames53解决方案很好,但不能在我的VS2017上编译。使用ctime的解决方案无法编译,因为非常不推荐使用localtime。带有date.h的那个没有使用当前的date.h进行编译。我刚刚取消github,即使文档说它们应该,因为今天不能按原样流式传输。我省略了包含但这里的代码是有用的:

void TimeTest()
{
    auto n = std::chrono::system_clock::now();
    auto in_time_t = std::chrono::system_clock::to_time_t(n);
    std::tm buf;
    localtime_s(&buf, &in_time_t);
    std::cout << std::put_time(&buf, "%Y-%m-%d %X") << std::endl;

}

// I just added date.h from this link's guthub to the project.
// https://howardhinnant.github.io/date/date.html
void TimeTest1() {
    auto now = std::chrono::system_clock::now();
    auto today =  floor<date::days>(std::chrono::system_clock::now());
    std::cout << date::year_month_day{ today } << ' ' << date::make_time(now - today) << std::endl;
}

// output is 
// 2018-04-08 21:19:49
// 2018-04-08 18:19:49.8408289

随意修复bames53解决方案并删除我的。我的文字不符合评论。我相信它可以让许多人免于悲伤。

答案 3 :(得分:1)

为了获得毫秒数,我使用chrono和C函数localtime_r是线程安全的(与std :: localtime相反)。

#include <iostream>
#include <chrono>
#include <ctime>
#include <time.h>
#include <iomanip>


int main() {
  std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
  std::time_t currentTime = std::chrono::system_clock::to_time_t(now);
  std::chrono::milliseconds now2 = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
  struct tm currentLocalTime;
  localtime_r(&currentTime, &currentLocalTime);
  char timeBuffer[80];
  std::size_t charCount { std::strftime( timeBuffer, 80,
                                         "%D %T",
                                          &currentLocalTime)
                         };

  if (charCount == 0) return -1;

  std::cout << timeBuffer << "." << std::setfill('0') << std::setw(3) << now2.count() % 1000 << std::endl;
  return 0;
}

对于格式:http://www.cplusplus.com/reference/ctime/strftime/

答案 4 :(得分:1)

fmt 库能够格式化 tm 结构:它具有与 strftime 相同的规范。

#include <ctime>
#include <fmt/chrono.h>

std::string current_datetime(void)
{
  std::time_t tt = std::time(nullptr);
  std::tm *tm = std::localtime(&tt);
  return fmt::format("{:%Y%m%d}", *tm);
}

答案 5 :(得分:0)

您可以使用Boost lexical_cast而不是字符串流操作来改进@ bames53的答案。

以下是我的工作:

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

std::string return_current_time_and_date() {
    auto current_time = std::time(0);
    return boost::lexical_cast<std::string>(std::put_time(std::gmtime(& current_time), "%Y-%m-%d %X"));
}