C# 到 C++ : Convert C# Time calculation to C++ chrono

标签 c# c++ rounding timespan c++-chrono

我的任务是将一些 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 且值介于 0sseconds{iRoundTo 之间} - 1s

关于C# 到 C++ : Convert C# Time calculation to C++ chrono,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70749292/

相关文章:

C# 多线程按值传递还是引用传递?

c++ - 禁用 move 构造函数

c# - 四舍五入到下一个更高的数字

php - 我如何在 PHP 中四舍五入一个数字?

c# - 使用ZXing.Net生成GS1-128

c# - 如何在 Init() 之外注册 HttpApplication 事件的处理程序

c++ - 在 C/C++ 中使用 JACK 和 fftw 的音频频谱

c++ - QThread::wait() 不使用直接连接不返回

c++ - 在 C++ 中将正 float 组转换为带舍入的无符号短数组

c# - 在 ASP.NET 应用程序中存储应用程序配置参数的正确方法是什么?