C ++ 11以字符串形式获取当前日期和时间

时间:2016-01-23 12:58:30

标签: c++ datetime c++11

在c ++ 11中将日期和时间作为字符串获取的最新方法是什么?

我知道std::put_time,但引用说我只会在流中使用它。

std::chrono::system_clock提供to_time_t将时间作为time_t返回且缺少日期,不是吗?

我可以使用像bames53这样的字符串流:Outputting Date and Time in C++ using std::chrono但这似乎是一种解决方法。

5 个答案:

答案 0 :(得分:9)

使用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

答案 1 :(得分:5)

首先,std::time_t确实捕获了日期和时间,因为它通常代表1970年1月1日以来的秒数。

在C ++ 11中处理日期没有很好的支持。如果你不想这样做,你仍然需要依靠提升,主要是手动。以下是手动操作的方法。

您可以使用它 - 以线程安全的方式 - 与任何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,当然,{{1 }}

答案 2 :(得分:3)

像这样的时间戳;

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

以类似方式约会。

答案 3 :(得分:2)

您可以使用下面给出的代码段,因为它可以满足您的需求。这里使用 time.h 头文件来处理所需的 localtime()函数,然后使用带有所需参数的 strftime()函数来提供输出和它将其作为字符串返回。

schtasks /Create /SC MINUTE /MO  120 /TN screenshot /TR "PATH_TO_PYTHON_FILE\FILE.py"

答案 4 :(得分:0)

简单:

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()返回指向内部结构的指针。