我的任务是将一些 C# 代码转换为 C++,但我遇到了 chrono 问题。目标是将时间舍入为可变时间跨度。
C#:
int iRoundTo = 30; // can be 45 or other variable value, not a const
DateTime dt = Floor(DateTime.Now, new TimeSpan(0, 0, 0, iRoundTo));
我找到了 const iRoundTo 的解决方案,但这不是我正在寻找的。 如何使用 std::chono 将其转换为 C++?
C++:
std::chrono::seconds diff(iRoundTo);
auto dt = std::chrono::floor<diff>(Now);
由于编译错误,这不起作用。
谢谢。
最佳答案
我对这个答案做了一些猜测,但我的猜测是你想将当前时间截断到当前半分钟的下限(如果iRoundTo == 30
)。
如果我是对的,只要 iRoundTo
是编译时常量,这很容易做到。
#include <chrono>
#include <iostream>
int
main()
{
using RoundTo = std::chrono::duration<int, std::ratio<30>>;
auto Now = std::chrono::system_clock::now();
auto dt = std::chrono::floor<RoundTo>(Now);
std::cout << dt << '\n';
}
上面创建了一个新的持续时间类型,长度为 30 秒。然后,它获取当前时间并将其下限(向下截断)到前一个半分钟单位。然后它打印出结果。打印之前的所有内容都可以在 C++17 中运行。打印(最后一行)需要 C++20。
我的示例输出:
2022-01-18 01:45:30
上面的代码也可以在 C++17 之前工作,但在这种情况下,您需要找到自己的 floor
(例如 date.h )或使用 std::chrono::duration_cast
向零截断。
更新
在下面的注释中,解释了 iRoundTo
不是编译时常量,但始终代表秒的倍数。在这种情况下,我将分两步执行此操作:
int iRoundTo = 30;
auto Now = std::chrono::system_clock::now();
// First truncate to seconds
auto dt = std::chrono::floor<std::chrono::seconds>(Now);
// Then subtract of the modulus according to iRoundTo
dt -= dt.time_since_epoch() % iRoundTo;
子表达式 dt.time_since_epoch() % iRoundTo
的类型为 seconds
且值介于 0s
和 seconds{iRoundTo 之间} - 1s
。
关于C# 到 C++ : Convert C# Time calculation to C++ chrono,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70749292/