在c++中是否有跨平台的方法来获取当前的日期和时间?
当前回答
下面是不弃用的现代c++解决方案,用于将时间戳作为std::string用于例如文件名:
std::string get_file_timestamp()
{
const auto now = std::chrono::system_clock::now();
const auto in_time_t = std::chrono::system_clock::to_time_t(now);
std::stringstream output_stream;
struct tm time_info;
const auto errno_value = localtime_s(&time_info, &in_time_t);
if(errno_value != 0)
{
throw std::runtime_error("localtime_s() failed: " + std::to_string(errno_value));
}
output_stream << std::put_time(&time_info, "%Y-%m-%d.%H_%M_%S");
return output_stream.str();
}
其他回答
老问题的新答案:
这个问题没有指定在哪个时区。有两种合理的可能性:
在UTC。 在计算机的本地时区。
对于1,你可以使用这个日期库和下面的程序:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
std::cout << system_clock::now() << '\n';
}
这对我来说只是输出:
2015-08-18 22:08:18.944211
日期库本质上只是为std::chrono::system_clock::time_point添加了一个流操作符。它还添加了许多其他不错的功能,但在这个简单的程序中没有使用这些功能。
如果您更喜欢2(本地时间),则有一个timezone库构建在日期库之上。这两个库都是开源和跨平台的,假设编译器支持c++ 11或c++ 14。
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
auto local = make_zoned(current_zone(), system_clock::now());
std::cout << local << '\n';
}
这对我来说只是输出:
2015-08-18 18:08:18.944211 EDT
make_zoned的结果类型是一个date::zoned_time,它是一个date::time_zone和std::chrono::system_clock::time_point的配对。这个时间对表示本地时间,但也可以表示UTC,这取决于您如何查询它。
通过上面的输出,您可以看到我的计算机目前处于UTC偏移量为-4h的时区,以及EDT的缩写。
如果需要使用其他时区,也可以实现这一点。例如,要查找澳大利亚悉尼的当前时间,只需将变量local的构造更改为:
auto local = make_zoned("Australia/Sydney", system_clock::now());
输出变为:
2015-08-19 08:08:18.944211 AEST
适用于c++ 20
这个库现在在c++ 20中被广泛采用。命名空间date已经消失,现在所有内容都在命名空间std::chrono中。并使用zoned_time代替make_time。删除标题“date.h”和“tz.h”,只使用<chrono>。
#include <chrono>
#include <iostream>
int
main()
{
using namespace std::chrono;
auto local = zoned_time{current_zone(), system_clock::now()};
std::cout << local << '\n'; // 2021-05-03 15:02:44.130182 EDT
}
在我写这篇文章的时候,部分实现刚刚开始出现在一些平台上。
从c++ 11开始,你可以使用std::chrono::system_clock::now()
示例(复制自en.cppreference.com):
#include <iostream>
#include <chrono>
#include <ctime>
int main()
{
auto start = std::chrono::system_clock::now();
// Some computation here
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "finished computation at " << std::ctime(&end_time)
<< "elapsed time: " << elapsed_seconds.count() << "s"
<< std::endl;
}
这应该打印如下内容:
finished computation at Mon Oct 2 00:59:08 2017
elapsed time: 1.88232s
#include <iostream>
#include <chrono>
#include <string>
#pragma warning(disable: 4996)
// Ver: C++ 17
// IDE: Visual Studio
int main() {
using namespace std;
using namespace chrono;
time_point tp = system_clock::now();
time_t tt = system_clock::to_time_t(tp);
cout << "Current time: " << ctime(&tt) << endl;
return 0;
}
你可以使用boost和chrono库:
#include <iostream>
#include <chrono>
#include <boost/date_time/posix_time/posix_time.hpp>
using boost::posix_time::to_iso_extended_string;
using boost::posix_time::from_time_t;
using std::chrono::system_clock;
int main()
{
auto now = system_clock::now();
std::cout << to_iso_extended_string(from_time_t(system_clock::to_time_t(now)));
}
你也可以直接使用ctime():
#include <stdio.h>
#include <time.h>
int main ()
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
printf ( "Current local time and date: %s", ctime (&rawtime) );
return 0;
}
推荐文章
- decltype(auto)的一些用途是什么?
- Shared_ptr转换为数组:应该使用它吗?
- Printf与std::字符串?
- 禁用复制构造函数
- 解析日期字符串并更改格式
- 只接受特定类型的c++模板
- c#和Java中的泛型有什么不同?和模板在c++ ?
- Java SimpleDateFormat("yyyy-MM-dd' t ' hh:mm:ss' z '")给出的时区为IST
- 在Java中转换字符串到日历对象
- c++ 11中的递归lambda函数
- 在c++中指针使用NULL或0(零)吗?
- 在c++中,如何将int值附加到字符串中?
- 如何在Android中获取当前日期?
- 如何创建一个日期对象从字符串在javascript
- 就性能而言,使用std::memcpy()还是std::copy()更好?