- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
最好/最简单的处理方式是什么Julian dates在 C++ 中?我希望能够在儒略日期和公历日期之间进行转换。我有 C++11 和 C++14。可以<chrono>
图书馆帮助解决这个问题?
最佳答案
在 Julian date 之间转换和 std::chrono::system_clock::time_point
需要做的第一件事是找出时代之间的差异。system_clock
没有官方纪元,但事实上的标准纪元是 1970-01-01 00:00:00 UTC(公历)。为方便起见,声明 Julian date 很方便。纪元方面的proleptic Gregorian calendar .该日历将当前规则向后扩展,并包括第 0 年。这使算术更容易,但必须注意通过减 1 和求反将 BC 年转换为负年(例如 2BC 是第 -1 年)。 Julian date纪元是 -4713-11-24 12:00:00 UTC(粗略地说)。<chrono>
库可以方便地处理这种规模的时间单位。此外,this date library可以方便地在公历日期和 system_clock::time_point
之间转换.找出这两个时代之间的区别很简单:
constexpr
auto
jdiff()
{
using namespace date;
using namespace std::chrono_literals;
return sys_days{jan/1/1970} - (sys_days{nov/24/-4713} + 12h);
}
std::chrono::duration
以小时为单位。在 C++14 中,这可以是
constexpr
我们可以使用计时持续时间文字
12h
而不是
std::chrono::hours{12}
.
constexpr
auto
jdiff()
{
using namespace std::chrono_literals;
return 58574100h;
}
58574100
的函数.这也可能是
constexpr
全局,但是你必须泄露你的 using 声明,或者决定不使用它们。
jdate_clock
) 很方便。由于我们至少需要处理半天这样的单位,而且通常将儒略日期表示为浮点日,所以我将
jdate_clock::time_point
从纪元开始的双基天数:
struct jdate_clock
{
using rep = double;
using period = std::ratio<86400>;
using duration = std::chrono::duration<rep, period>;
using time_point = std::chrono::time_point<jdate_clock>;
static constexpr bool is_steady = false;
static time_point now() noexcept
{
using namespace std::chrono;
return time_point{duration{system_clock::now().time_since_epoch()} + jdiff()};
}
};
I converted the return from
system_clock::now()
toduration
immediately to avoid overflow for those systems wheresystem_clock::duration
is nanoseconds.
jdate_clock
现在是一个完全合规且功能齐全的
<chrono>
时钟。例如,我可以找出现在的时间:
std::cout << std::fixed;
std::cout << jdate_clock::now().time_since_epoch().count() << '\n';
2457354.310832
jdate_clock::time_point
和
system_clock::time_point
是两种截然不同的类型,您不会意外地在其中执行混合算术。但您仍然可以从
<chrono>
中获得所有丰富的好处。库,例如在您的
jdate_clock::time_point
中添加和减去持续时间.
using namespace std::chrono_literals;
auto jnow = jdate_clock::now();
auto jpm = jnow + 1min;
auto jph = jnow + 1h;
auto tomorrow = jnow + 24h;
auto diff = tomorrow - jnow;
assert(diff == 24h);
auto tomorrow = system_clock::now() + 24h;
auto diff = tomorrow - jnow;
error: invalid operands to binary expression
('std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long long,
std::ratio<1, 1000000> > >' and 'std::chrono::time_point<jdate_clock, std::chrono::duration<double,
std::ratio<86400, 1> > >')
auto diff = tomorrow - jnow;
~~~~~~~~ ^ ~~~~
jdate_clock::time_point
来自
std::chrono::system_clock::time_point
.
jdate_clock::time_point
到
system_clock::time_point
或相反亦然。为此,可以轻松编写几个辅助函数:
template <class Duration>
constexpr
auto
sys_to_jdate(std::chrono::time_point<std::chrono::system_clock, Duration> tp) noexcept
{
using namespace std::chrono;
static_assert(jdate_clock::duration{jdiff()} < Duration::max(),
"Overflow in sys_to_jdate");
const auto d = tp.time_since_epoch() + jdiff();
return time_point<jdate_clock, decltype(d)>{d};
}
template <class Duration>
constexpr
auto
jdate_to_sys(std::chrono::time_point<jdate_clock, Duration> tp) noexcept
{
using namespace std::chrono;
static_assert(jdate_clock::duration{-jdiff()} > Duration::min(),
"Overflow in jdate_to_sys");
const auto d = tp.time_since_epoch() - jdiff();
return time_point<system_clock, decltype(d)>{d};
}
I've added static range checking which is likely to fire if you use nanoseconds or a 32bit-based minute as a duration in your source
time_point
.
duration
由于纪元(
duration
s 是“时钟中性”),添加或减去纪元之间的偏移量,然后转换
duration
进入想要的
time_point
.
time_point
之间转换s 使用任何精度,都以类型安全的方式。如果它编译,它就可以工作。如果你犯了一个编程错误,它会在编译时出现。有效的示例用途包括:
auto tp = sys_to_jdate(system_clock::now());
tp
是
jdate::time_point
除了它具有积分表示,精度与您的
system_clock::duration
相同。是(对我来说是微秒)。预先警告,如果它对你来说是纳秒(gcc),这将溢出,因为纳秒只有 +/- 292 年的范围。
auto tp = sys_to_jdate(time_point_cast<hours>(system_clock::now()));
tp
是自
jdate
以来的整数小时数时代。
using namespace std::chrono;
using namespace date;
std::cout << std::fixed;
auto jtp = jdate_clock::time_point{jdate_clock::duration{2457354.310832}};
auto tp = floor<seconds>(jdate_to_sys(jtp));
std::cout << "Julian date " << jtp.time_since_epoch().count()
<< " is " << tp << " UTC\n";
jdate_clock
创建一个
jdate_clock::time_point
.然后我们使用我们的
jdate_to_sys
转换函数来转换
jtp
成
system_clock::time_point
.这将有一个双倍和一个小时的表示。但这并不重要。重要的是将其转换为您想要的任何表示和精度。我已经用
floor<seconds>
完成了上面的操作.我也可以使用
time_point_cast<seconds>
它会做同样的事情。
floor
来自
the date library , 总是向负无穷大截断,并且更容易拼写。
Julian date 2457354.310832 is 2015-11-27 19:27:35 UTC
auto tp = round<seconds>(jdate_to_sys(jtp));
Julian date 2457354.310832 is 2015-11-27 19:27:36 UTC
auto tp = round<milliseconds>(jdate_to_sys(jtp));
Julian date 2457354.310832 is 2015-11-27 19:27:35.885 UTC
floor
和
round
上面提到的功能是
Howard Hinnant's date library 的一部分现在也可以在命名空间
std::chrono
下使用作为 C++17 的一部分。
关于c++ - 在 C++11/14 中处理儒略日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33964461/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!