在c ++ 11中将日期和时间作为字符串获取的最新方法是什么?
我知道std::put_time
,但引用说我只会在流中使用它。
有std::chrono::system_clock
提供to_time_t
将时间作为time_t
返回且缺少日期,不是吗?
我可以使用像bames53这样的字符串流:Outputting Date and Time in C++ using std::chrono但这似乎是一种解决方法。
答案 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()
返回指向内部结构的指针。