C# 到 C++:将 C# 时间计算转换为C++时间



我的任务是将一些 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));

我找到了constiRoundTo的解决方案,但这不是我想要的。 如何使用 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之间。

无法访问最新的工具(std::format 和 <<重载似乎都需要相当新的工具),到目前为止,我只对其进行了测试(如果您可以进一步测试,请编辑):

#include <chrono>
#include <iostream>
#include <ctime>
#include <iomanip>
//#include <format>
int main() {
int roundTo = 15;
auto dt = std::chrono::floor<std::chrono::seconds> (std::chrono::system_clock::now());
dt -= dt.time_since_epoch() % roundTo;
std::time_t t = std::chrono::system_clock::to_time_t(dt);
std::cout << std::ctime(&t); // Using <ctime>
std::cout << std::put_time(std::localtime(&t), "%Y-%m-%e %H:%M:%S") << 'n'; // Using <iomanip>
//std::cout << "date: " << std::format("%Y-%m-%e %H:%M:%S", dt) << 'n'; // Using <format>
//std::cout << "date: " << std::format("{%Y-%m-%e %H:%M:%S}", dt) << 'n'; // Using newer <format>
//std::cout << dt << 'n'; // Using << overload
}

最新更新