c++ - 如何用微秒创建时间戳
问题描述
我正在尝试生成分辨率为微秒的时间戳。我尝试使用这个答案 从 C++ 中的 std::chrono::time_point 中提取年/月/日等,还有这个:C++11 毫秒的实际系统时间, 但我不确定这样做是否正确:
template <typename Duration>
void print_time(tm t, Duration fraction) {
using namespace std::chrono;
std::printf("[%04u-%02u-%02u %02u:%02u:%02u.%03u.%03u]\n", t.tm_year + 1900,
t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec,
static_cast<unsigned>(fraction / milliseconds(1)),
static_cast<unsigned>(fraction / microseconds(1)));
}
int main() {
using namespace std;
using namespace std::chrono;
system_clock::time_point now = system_clock::now();
system_clock::duration tp = now.time_since_epoch();
tp -= duration_cast<seconds>(tp);
time_t tt = system_clock::to_time_t(now);
cout << tp.count() <<endl;
print_time(*gmtime(&tt), tp);
print_time(*localtime(&tt), tp);
这段代码的输出是:
324760155 [2019-09-15 10:09:13.324.324760] [2019-09-15 10:09:13.324.324760]
解决方案
template <typename Rep, typename Period>
void
print_time(tm t, std::chrono::duration<Rep, Period> fraction)
{
using namespace std::chrono;
auto ms = duration_cast<milliseconds>(fraction);
fraction -= ms;
auto us = duration_cast<microseconds>(fraction);
std::printf("[%04u-%02u-%02u %02u:%02u:%02u.%03u.%03u]\n", t.tm_year + 1900,
t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec,
static_cast<unsigned>(ms / milliseconds(1)),
static_cast<unsigned>(us / microseconds(1)));
}
我对您的参数所做的更改使其不会过于通用并接受不是
chrono::duration
.要得到
milliseconds
out 的数量fraction
(并且假设fraction
是非负数),只需duration_cast<milliseconds>(fraction)
.现在你需要从 中减去
milliseconds
上一步中获得的值fraction
,以免它们在下一步中回来困扰你。要得到
microseconds
out 的数量fraction
(并且假设fraction
是非负数),只需duration_cast<microseconds>(fraction)
.
如果您想更进一步并从 中nanoseconds
取出fraction
,则需要先减去该microseconds
部分,然后再继续。
推荐阅读
- java - 使用ManyToMany关系时如何在Spring中获取对象外键列表?
- c# - 什么是翻译事物的最佳方式(即天)
- c# - 在 C# 中控制传递依赖
- android - 如何将 RecyclerView 数据发送到 BottomSheetDialog
- regex - Google Script,如何在正则表达式搜索中使用变量?
- javascript - 如何用 Jasmine 模拟静态函数?
- reflection - roslyn 是反射相关任务的合理替代品吗?
- spring-boot - 在 Spring Boot 中使用 InMemoryUserDetails 获取错误凭据
- r - 如何将 csv 文件加载到 R 中作为与 glmnet 和逻辑回归一起使用的因素
- python-3.x - 使用 model.fit、model.fit_generator 和 model.train_on_batch 训练 tf.keras.Sequential 模型的预期性能