转换自公历日历开始至今的天数

奥斯特洪

我正在使用包含时间维度的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

您没有提到想要的精度,但是从示例输出中,我认为是几秒钟。您可以选择所需的任何计时精度。该程序只是将您的时间转换doubledouble基于时间的周期days周期为,然后将其添加到纪元。结果是chrono::system_clock::time_point您所选择的精度。虽然我建议您不要使用nanosecondsnanoseconds精度比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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章