C++11获取当前日期和时间作为字符串

q43xntqr  于 2023-08-09  发布在  其他
关注(0)|答案(5)|浏览(136)

在C++11中,获取字符串形式的日期和时间的最新方法是什么?
我知道std::put_time,但是参考资料说我只能在流中使用它。
有一个std::chrono::system_clock,它提供了to_time_t,返回的时间是time_t,缺少日期,不是吗?
我可以使用像bames53这样的字符串流:Outputting Date and Time in C++ using std::chrono,但这似乎是一个变通方法。

nhhxz33t

nhhxz33t1#

使用Howard Hinnant's free, open-source header-only datetime library,您可以在一行代码中获得当前UTC时间作为std::string

std::string s = date::format("%F %T", std::chrono::system_clock::now());

字符串
我刚刚运行了这个,字符串包含:

2017-03-30 17:05:13.400455


是的,它甚至可以提供完整的精确度。如果你不喜欢这种格式,所有的strftime标志都可用。如果你想要你的本地时间,也有一个timezone library可用,虽然它不是头只。

std::string s = date::format("%F %T %Z", date::make_zoned(date::current_zone(),
                                         std::chrono::system_clock::now()));


输出量:

2017-03-30 13:05:13.400455 EDT

C++20更新

现在可以使用std::lib头文件<chrono><format>来完成:

#include <chrono>
#include <format>
#include <string>

int
main()
{
    std::string s1 = std::format("{:%F %T}", std::chrono::system_clock::now());
    std::string s2 = std::format("{:%F %T %Z}",
        std::chrono::zoned_time{std::chrono::current_zone(),
                                std::chrono::system_clock::now()});
}


Demo的函数。

mo49yndu

mo49yndu2#

更简单:

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

    char buf[100] = {0};
    std::strftime(buf, sizeof(buf), "%Y-%m-%d", std::localtime(&now));
    return buf;
}

字符串
也要根据时间适当调整格式。
请注意,我怀疑这对于多线程代码不太适用,因为std::localtime()返回一个指向内部结构体的指针。

odopli94

odopli943#

首先,std::time_t确实捕获日期和时间,因为它通常表示从1970年1月1日开始的秒数。
在C++11中没有对处理日期的支持。如果你不想这样做,你仍然必须依赖于boost,主要是手动。下面介绍如何手动执行此操作。
您可以以线程安全的方式将它与任何std::chrono::*clock(如std::system_clock)一起使用,如下所示:

std::string get_date_string(std::chrono::time_point t) {
  auto as_time_t = std::chrono::system_clock::to_time_t(t);
  struct tm tm;
  if (::gmtime_r(&as_time_t, &tm))
    if (std::strftime(some_buffer, sizeof(some_buffer), "%F", &tm))
      return std::string{some_buffer};
  throw std::runtime_error("Failed to get current date as string");
}

字符串
在其他地方,您可以发布:

get_date_string(std::system_clock::now());


这个解决方案相对好的一点是,在API级别,你仍然使用现代的、可移植的C++概念,比如std::chrono::time_point,当然还有std::string

41ik7eoe

41ik7eoe4#

像这样的时间戳;

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

int main() {

    std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
    std::time_t start_time = std::chrono::system_clock::to_time_t(now);
    char timedisplay[100];
    struct tm buf;
    errno_t err = localtime_s(&buf, &start_time);
    if (std::strftime(timedisplay, sizeof(timedisplay), "%H:%M:%S", &buf)) {
        std::cout << timedisplay << '\n';
    }
}

字符串
以类似的方式约会。

laawzig2

laawzig25#

您可以使用下面给出的代码片段,因为它将服务于您的目的。这里使用time.h头文件作为所需的**localtime()函数,然后使用带有所需参数的strftime()**函数将给予输出,并将其作为字符串返回。

#include <iostream>
#include <string>
#include <time.h>
std::string current_date();
std::string current_time();
int main(){
    std::cout<<"Current date => "<<current_date()<<"\n";
    std::cout<<"Current time => "<<current_time()<<"\n";
}
std::string current_date(){
    time_t now = time(NULL);
    struct tm tstruct;
    char buf[40];
    tstruct = *localtime(&now);
    //format: day DD-MM-YYYY
    strftime(buf, sizeof(buf), "%A %d/%m/%Y", &tstruct);
    return buf;
}
std::string current_time(){
    time_t now = time(NULL);
    struct tm tstruct;
    char buf[40];
    tstruct = *localtime(&now);
    //format: HH:mm:ss
    strftime(buf, sizeof(buf), "%X", &tstruct);
    return buf;
}

字符串

相关问题