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

A. *_*hun 2 c++ datetime netcdf netcdf4

我正在使用包含时间维度的netCDF4文件。此时间维度的值是代表从1582-10-15 00:00开始的天的双精度值。为了允许用户与数据进行交互,我需要将这些时间戳转换为实际日期(例如01:01:2014T00:00:00)。

在研究这一点时,我无法在c ++中找到解决方案。netCDF Python库提供了num2date以及date2num,它们正是我所需要的。可悲的是,我在c ++库中找不到这些功能。我将不胜感激有关如何执行此操作的任何建议。

How*_*ant 5

使用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';
}
Run Code Online (Sandbox Code Playgroud)

输出:

2019-08-27 13:44:06
Run Code Online (Sandbox Code Playgroud)

您没有提到想要的精度,但是从您的示例输出中,我认为是几秒钟。您可以选择所需的任何时间精度。该程序只是将您的时间转换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>是+/- 29.2万年(很多)。

您可以使用相同的库将其格式化time_point为所需的任何样式。例如:

std::cout << format("%d:%m:%YT%T", to_time_point(159562.572297)) << '\n';
Run Code Online (Sandbox Code Playgroud)

输出:

27:08:2019T13:44:06
Run Code Online (Sandbox Code Playgroud)

如果您选择使用较新的标准,则使用此库将非常好地迁移到C ++ 20。