Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以C+;格式输出日期和时间+;使用std::chrono_C++_Date_C++11_Time_Chrono - Fatal编程技术网

C++ 以C+;格式输出日期和时间+;使用std::chrono

C++ 以C+;格式输出日期和时间+;使用std::chrono,c++,date,c++11,time,chrono,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

我一直在升级一些旧代码,并尝试在可能的情况下更新到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::字符串返回\u当前\u时间\u和\u日期()常量
{
现在时间=时间(0);
struct-tm-tstruct;
char-buf[80];
tstruct=*本地时间(&now);
strftime(buf,sizeof(buf),%Y-%m-%d%X“,&t结构);
返回buf;
}
我想用std::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();
}
这将打印出类似“2015-07-24 05:15:34.043473124 UTC”的内容



另一方面,C++11不希望返回
const
对象;无法从中移动常量返回值。我还删除了trailing const,因为trailing const仅对成员函数有效,并且该函数不需要是成员。

您可以通过使用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"));
}
#包括
#包括
std::字符串返回\u当前\u时间和\u日期(){
自动当前_时间=标准::时间(0);
返回boost::词法转换(std::put_time(std::gmtime(¤t_time),%Y-%m-%d%X”);
}

bames53解决方案不错,但不要在我的VS2017上编译。使用ctime的解决方案无法编译,因为localtime非常不受欢迎。带有date.h的文件并没有使用当前的date.h进行编译。我只是离开了github,尽管文档中说应该这样做,因为今天不能像现在这样流式传输。我省略了include,但下面是有效的代码:

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
void TimeTest()
{
自动n=std::chrono::system_clock::now();
自动输入时间=标准::时钟::系统时钟::到时间(n);
std::tm-buf;
本地时间(&buf,&in时间);
std::cout一个例子:

#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;

}
#包括
#包括
#包括
std::string getTimeStr(){
std::time\u t now=std::chrono::system\u clock::to\u time\t(std::chrono::system\u clock::now());
std::字符串s(30,'\0');
std::strftime(&s[0],s.size(),%Y-%m-%d%H:%m:%s),std::localtime(&now));
返回s;
}
int main(){

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

#包括
#包括
#包括
#包括
#包括
int main(){
std::chrono::system_clock::time_point now=std::chrono::system_clock::now();
std::time\u t currentTime=std::chrono::system\u clock::to\u time\u t(现在);
std::chrono::microsides now2=std::chrono::duration_cast(now.time_since_epoch());
struct tm currentLocalTime;
本地时间(当前时间和当前本地时间);
字符时间缓冲区[80];
std::size\u t charCount{std::strftime(timeBuffer,80,
“%D%T”,
&当前本地时间)
};
if(charCount==0)返回-1;

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

#包括
#包括
std::字符串当前\ U日期时间(无效)
{
std::time\u t tt=std::time(nullptr);
std::tm*tm=std::localtime(&tt);
返回fmt::format(“{:%Y%m%d}”,*tm);
}

如果已经有这样的问题,请查找,如果没有,请询问。可能的重复:使用C++11不会有太大的进步。chrono更多的是关于计时(某件事情花了多长时间)而不是一天中的时间类型的东西。不过,您可以查看Boost Date time。它有更强大的日期和时间功能。使用chrono和output获取日期和时间?请参阅@DyP,它看起来很有希望,但我需要从函数返回字符串,不确定如何使用std::put_Timer执行此操作。请注意,一些旧的编译器可能无法识别<代码> > STD::PtuthTime<代码>。一旦我尝试编译代码,使用C++在CITOS 7上编写了代码“STD::PuthTime:/Coogle>,它失败了。在GCC中,代码< STD::PuthTime< /Cuff>支持的C++函数类似于STD::PUTHOST时间,但返回字符串:@ Nick No.。C函数<代码> STFTIME/<代码>将允许您用C字符串填充缓冲区。函数
asctime
将以固定的时间格式返回一个C字符串。谢谢,如果你不使用
名称空间日期,我想你可以使用字符串流来放置时间;
如果你添加
使用日期::运算符Howard,非常感谢你编写和共享这个库。说到这里,我宁愿不使用as-i's在我的日子里,名称空间冲突带来的bug和歧义已经够多了。另外,如果我们是精确的,我想指出第一个示例输出本地时间,而第二个是世界时间。很高兴我能提供帮助。
在函数范围内使用
是一个很好的折衷方案,因为冲突发生时更容易控制。我意识到这一点不是完美的,但它是对STD::类型的最佳插入流,由第三方库编写。但是就在上个月,我说服C++委员会将这个流操作符放置在命名空间STD::Cale+<代码> > C++ 20中,这样它将被ADL发现。然后,它将不再需要使用< /代码> G的<代码>。关于UTC输出的ood观察。还提供了一个更高级别的库,该库提供本地时间的操作。可以是计算机当前的本地时区,也可以是特定的指定时区(例如“美国/纽约”)。以下是
#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;

}
#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;
}