我正在使用包含时间维度的netCDF4文件。此时间维度的值是代表从1582-10-15 00:00开始的天的双精度值。为了允许用户与数据进行交互,我需要将这些时间戳转换为实际日期(例如01:01:2014T00:00:00)。
在研究这一点时,我无法在c ++中找到解决方案。netCDF Python库提供num2date以及date2num,它们正是我所需要的。可悲的是,我在c ++库中找不到这些函数。我将不胜感激有关如何执行此操作的任何建议。
使用Howard Hinnant的时间/日期库非常容易做到这一点。
#include "date/date.h"
#include <iostream>
date::sys_time<std::chrono::seconds>
to_time_point(double d)
{
using namespace date;
using namespace std::chrono;
using ddays = duration<double, days::period>;
return round<seconds>(ddays{d} + sys_days{1582_y/10/15});
}
int
main()
{
using namespace date;
std::cout << to_time_point(159562.572297) << '\n';
}
输出:
2019-08-27 13:44:06
您没有提到想要的精度,但是从示例输出中,我认为是几秒钟。您可以选择所需的任何计时精度。该程序只是将您的时间转换double
为double
基于时间的周期days
,周期为,然后将其添加到纪元。结果是chrono::system_clock::time_point
您所选择的精度。虽然我建议您不要使用nanoseconds
。nanoseconds
精度比double
在此范围内提供的精度高3个数量级,范围sys_time<nanoseconds>
为[1677-09-21 00:12:43.145224192,2262-04-11 23:47:16.854775807]。而范围sys_time<microseconds>
是+/- 292,000年(大量)。
您可以使用相同的库将其格式化time_point
为所需的任何样式。例如:
std::cout << format("%d:%m:%YT%T", to_time_point(159562.572297)) << '\n';
输出:
27:08:2019T13:44:06
如果您选择使用较新的标准,则使用此库将非常好地迁移到C ++ 20。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句