【学习SLAM】c++时间戳 获取与转换

2023-05-16

https://tool.lu/timestamp/

c++时间戳

自 1970 年 1 月 1 日以来经过的秒数:
time_t time1 = time(0);//这里获取到的其实就是一个long类型的时间戳,是秒级别的(10位),非毫秒级别

    time_t time1 = time(0);
    cout << "time1 = " << time1 << endl;//1498122787
    char * strTime = ctime(&time1);
    cout << "strTime = " << strTime << endl;//Thu Jun 22 17:13:07 2017
 
    time_t startTime = 1498122787;
    double betweenSecond = difftime(time1, startTime);//该函数返回 time1 和 time2 之间相差的秒数。
    cout << "betweenSecond = " << betweenSecond << endl;//Thu Jun 22 17:13:07 2017
  1.  

1.时间戳转格式化

time_t t = time(0);
struct tm *p;
p=gmtime(&t);
char s[100];
strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", p);
printf("%d: %s\n", (long)t, s); //1498124250: 2017-06-22 09:37:30

2.格式化转时间戳

long getTick(char *str_time)
{
    struct tm stm;
    int iY, iM, iD, iH, iMin, iS;
 
    memset(&stm,0,sizeof(stm));
 
    iY = atoi(str_time);
    iM = atoi(str_time+5);
    iD = atoi(str_time+8);
    iH = atoi(str_time+11);
    iMin = atoi(str_time+14);
    iS = atoi(str_time+17);
 
    stm.tm_year=iY-1900;
    stm.tm_mon=iM-1;
    stm.tm_mday=iD;
    stm.tm_hour=iH;
    stm.tm_min=iMin;
    stm.tm_sec=iS;
    return mktime(&stm);
}
 
int main()  
{  
    char str_time[19];  
    printf("请输入时间:"); /*(格式:2011-12-31 11:43:07)*/  
    gets(str_time);  
    printf("%ld\n", GetTick(str_time));  
    return 0;      
}   

应示示例2

// mothed  1   2019-04-28 17:07:19
#include <string>
#include <time.h>
#include <stdio.h>
#include <iostream>
using namespace std;

string getTime()
{
    time_t timep;//time_t 获得时间只能精确到秒,clock_t 获得时间能够精确到毫秒
    time (&timep);
    cout << timep<< endl;//1556449032 10位
    char tmp[64];
    strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S",localtime(&timep) );
    return tmp;
}

int main(){
    string   time = getTime();
    cout << time << endl;//2019-04-29 13:51:45

    return 0;
}

 

C++11获取时间戳和时间戳转日期(毫秒精度)

获取时间戳

std::time_t getTimeStamp()
{
    std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
    auto tmp=std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
    std::time_t timestamp = tmp.count();
    //std::time_t timestamp = std::chrono::system_clock::to_time_t(tp);
    return timestamp;
}

时间戳转日期

其中int64 为自定义跨平台的数据类型

std::tm* gettm(int64 timestamp)
{
    int64 milli = timestamp+ (int64)8*60*60*1000;//此处转化为东八区北京时间,如果是其它时区需要按需求修改
    auto mTime = std::chrono::milliseconds(milli);
    auto tp=std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds>(mTime);
    auto tt = std::chrono::system_clock::to_time_t(tp);
    std::tm* now = std::gmtime(&tt);
    printf("%4d年%02d月%02d日 %02d:%02d:%02d\n",now->tm_year+1900,now->tm_mon+1,now->tm_mday,now->tm_hour,now->tm_min,now->tm_sec);
   return now;
}

应用示例

// mothed    2019-04-28 17:07:19
#include <string>
#include <time.h>
#include <chrono>   // for time stamp
#include <stdio.h>
#include <iostream>
#include<iomanip>
using namespace std;

std::time_t getTimeStamp()
{
    std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
    auto tmp=std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
    std::time_t timestamp = tmp.count();
    //std::time_t timestamp = std::chrono::system_clock::to_time_t(tp);
    return timestamp;
}

std::clock_t getTimeStamp_s()
{
    std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
    auto tmp=std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
    std::clock_t timestamp = tmp.count();
    //std::clock_t timestamp = std::chrono::system_clock::to_time_t(tp);
    return timestamp;
}

int main(){

    // 记录系统时间
    auto start = chrono::system_clock::now();
    long i=0;
    while(i<1111111111)
        i++;
    auto now = chrono::system_clock::now();
    auto timestamp = chrono::duration_cast<chrono::milliseconds>(now - start);
    cout<<setiosflags(ios::fixed)<<setprecision(6)<<double(timestamp.count())/1000.0<<endl;//1.569000

    time_t start1=getTimeStamp();
    cout<<setprecision(6)<<start1/1000.0<<endl;//1556450562.840000

    clock_t start2=getTimeStamp_s();
    cout<<setprecision(6)<<start2/1000.0<<endl;//1556450562.840000
    return 0;
}

 

其他示例


// mothed 2   //1556442813891  秒级 13位

#include<iostream>
#include <sys/time.h>
#include<iomanip>
using namespace std;
int64_t getCurrentTime()
{
    struct timeval tv;
    gettimeofday(&tv,NULL);
    return tv.tv_sec * 1000 + tv.tv_usec/1000;//????????
}

double getCurrentTime_s()//XXXXXXX 
{
    struct timeval tv;
    gettimeofday(&tv,NULL);
    return tv.tv_sec * 1000 + tv.tv_usec/1000;//????????
}


int main()
{
    int64_t curTime;
    int64_t start = getCurrentTime();
    while(true)
    {
        curTime = getCurrentTime();
        cout <<std::defaultfloat<< setprecision(16)<<curTime<<endl; //1556442813891 (13位  int64_t)
        long i=0;
        while(i<1000) i++;
        cout << curTime - start <<endl;
    }
    
    
    //XXXXXXXXXXXX
    //    double curTime_s;
    //    double start_s = getCurrentTime_s();
    //    while(true)
    //    {
    //        curTime_s = getCurrentTime_s();
    //        //cout <<std::defaultfloat<< setprecision(6)<<curTime_s/1000<<endl; //1.55652e+09
    //        cout <<setprecision(6)<<curTime_s/1000<<endl; //1.55652e+09
    //        long i=0;
    //        while(i<11111) i++;
    //        cout << curTime_s - start_s <<endl;
    //    }
    
    return 0;
}

 

其他示例 XX


// mothed  3 
#include <string>
#include <time.h>
#include <stdio.h>
#include <iostream>
#include<iomanip>
using namespace std;


int main(){
    clock_t start,ends;
    start=clock();
        cout<<setiosflags(ios::fixed)<<setprecision(6)<<start<<endl;//7368
            long i=0;
            while(i<1000000) i++;
    ends=clock();
    cout<<ends-start<<endl;//1453

    return 0;
}

 

补充

在time.h文件中,我们可以找到对它的定义:

#ifndef _CLOCK_T_DEFINED

typedef long clock_t;

#define _CLOCK_T_DEFINED

#endif

很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

#define CLOCKS_PER_SEC ((clock_t)1000)

在linux系统下,CLOCKS_PER_SEC的值可能有所不同,目前使用的linux打印出来的值是1000000,表示的是微秒。这一点需要注意。

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:

void elapsed_time()

{

printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);

}

当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main(void)

{

long i = 10000000L;

clock_t start, finish;

double duration;

/* 测量一个事件持续的时间*/

printf"Time to do %ld empty loops is ", i) ;

start = clock();

while( i-- );

finish = clock();

duration = (double)(finish - start) / CLOCKS_PER_SEC;

printf"%f seconds\n", duration );

system("pause");

}

运行结果

Time to do 10000000 empty loops is 0.03000 seconds

上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是1毫秒。

宏CLOCKS_PER_SEC适用于将计算系统时间类型转换为用户可读的秒时间,包含于头文件ctime(或time.h)中

利用clock()函数和for循环完成程序定时暂停

在很久以前人们就用for来使程序暂停了,但是面对的问题是计算机越来越强大,以至于单用for循环已经无法控制计算机的处理速度,此时使用clock()函数就可以完成对程序的有效计时,并将这个时间用于暂停。

#include<iostream>

#include<ctime>//or time.h

using namespace std;

int main()

{

//省略

int b;

int b=clock()/CLOCKS_PER_SEC;

for(int i=0;i<100;)//完成100毫秒定时

{

i=clock()/CLOCKS_PER_SEC;

i=i-b;

}

//省略

return 0;

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【学习SLAM】c++时间戳 获取与转换 的相关文章

  • 《视觉SLAM十四讲》学习笔记-第四讲部分习题的证明思路

    1 验证SO 3 SE 3 和Sim 3 关于乘法成群 证明 先看SO 3 定义为 SO 3 R R3 3 RR I det R 1 S O 3 R
  • 基于深度相机的三维重建技术

    本文转载自http www bugevr com zblog id 14 原创作者bugeadmin 转载至我的博客 主要是为了备份 日后查找方便 谢谢原创作者的分享 三维重建 3D Reconstruction 技术一直是计算机图形学和计
  • ORB_SLAM3复现——上篇

    ORB SLAM3 前言 1 ORB SLAM3 2 准备环境 2 1 C 11 Compiler 2 2 Pangolin 2 3 Opencv 2 4 Eigen 3 复现ORB SLAM3 3 1 下载代码 3 2 执行build s
  • np.meshgrid()函数 以及 三维空间中的坐标位置生成 以及 numpy.repeat()函数介绍

    一 np meshgrid 函数 1 np meshgrid 介绍 X Y np meshgrid x y 代表的是将x中每一个数据和y中每一个数据组合生成很多点 然后将这些点的x坐标放入到X中 y坐标放入Y中 并且相应位置是对应的 下面是
  • 从零开始一起学习SLAM(9)不推公式,如何真正理解对极约束?

    文章目录 对极几何基本概念 如何得到极线方程 作业 此文发于公众号 计算机视觉life 原文链接 从零开始一起学习SLAM 不推公式 如何真正理解对极约束 自从小白向师兄学习了李群李代数和相机成像模型的基本原理后 感觉书上的内容没那么难了
  • 图像匹配算法

    图像匹配算法分为3类 基于灰度的匹配算法 基于特征的匹配算法 基于关系的匹配算法 1 基于灰度的模板匹配算法 模板匹配 Blocking Matching 是根据已知模板图像到另一幅图像中寻找与模板图像相似的子图像 基于灰度的匹配算法也称作
  • 关于GPS、惯导、视觉里程计的几个定义

    1 首先写几个定义 惯性导航系统 Inertial Navigation System INS 全球定位卫星系统 Global Navigation Satellite System GNSS GNSS 包括全球定位系统 Global Po
  • 动态场景下基于实例分割的SLAM(毕业设计开题及语义分割部分)

    动态场景下基于实例分割的SLAM 毕业论文设计思路及流水 前言 今年选了个比较难的毕设题目 这里记录一下自己思路和流程 为之后的学弟学妹 划掉 铺个方向 会按日期不定期的更新 一 开题 2019 12 24 考研前选择课题是 利用深度学习对
  • PnP 问题

    欢迎访问我的博客首页 PnP 问题 1 DLT 2 P3P 3 G2O 求解 PnP 3 1 单目 3 2 双目 4 自定义顶点与边优化内参 4 1 二元边 4 2 三元边 4 3 总结 5 参考 PnP Perspective n Poi
  • Lego-LOAM IMU坐标系变换的详细记录

    Lego LOAM IMU坐标系变换的详细记录 0 基础知识 1 IMU 重力加速度消除 2 相机坐标系 camera 到初始坐标系 camera init 的转换 最近看了Lego LOAM 的IMU部分 没看懂IMU的坐标系变换 看其它
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • Eigen::aligned_allocator

    如果STL容器中的元素是Eigen库数据结构 例如这里定义一个vector容器 元素是Matrix4d 如下所示 vector
  • ORB-SLAM2:基于可识别特征的自主导航与地图构建

    目录 ORB SLAM2 基于可识别特征的自主导航与地图构建 简介 地图 A 地图特征点或3D ORB B 关键帧 C 可视化图像 位置识别 A 图像识别数据库 B 高效优化的ORB匹配 C 视觉一致性 自主导航追踪 A ORB特征获取 B
  • SLAM--三角测量SVD分解法、最小二乘法及R t矩阵的判断

    目录 一 三角测量 方法一 SVD分解法的推导 方法二 最小二乘法求解 二 ORB SLAM2 三角测量源码 三 利用Eigen源码实现三角测量 方法一 SVD分解法 方法二 最小二乘法求解 速度最快 方法三 利用OpenCV自带函数 四
  • GMAPPING的参数设置

    二 运行gmapping 我总结了运行gmapping的两种方法 1 基于命令行 rosrun gmapping slam gmapping scan scan delta 0 1 maxUrange 4 99 xmin 5 0 ymin
  • 二.全局定位--开源定位框架livox-relocalization实录数据集测试

    相关博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 基于固态雷达的全局
  • LIO-SAM运行自己数据包遇到的问题解决--SLAM不学无数术小问题

    LIO SAM 成功适配自己数据集 注意本文测试环境 Ubuntu18 04 ROS melodic版本 笔者用到的硬件以简单参数 激光雷达 速腾聚创16线激光雷达 RS Lidar 16 IMU 超核电子CH110型 9轴惯导 使用频率1
  • Ubuntu18.04安装Autoware1.15(解决Openplanner无法绕障的问题:Openplanner2.5)

    文章目录 一 下载Autoware1 15源码 二 安装依赖 三 修改CUDA版本 四 编译以及报错解决 编译 1 报 undefined reference to cv Mat Mat 的错就按照下面方式改相应包 2 遇到OpenCV的C
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以
  • KITTI校准文件中参数的格式

    我从以下位置访问了校准文件KITTI 的部分里程计 http www cvlibs net datasets kitti eval odometry php 其中一个校准文件的内容如下 P0 7 188560000000e 02 0 000

随机推荐

  • 对AI的理解及应用的思考

    1 概述 1 1 常用术语 1 2 AI学习方式及地位 序号 学习方法 地位 1 强化学习 Reinforcement Learning 犹如蛋糕上的一颗樱桃 2 监督学习 Supervised Learning 犹如蛋糕外的一层糖霜 3
  • (65)如何根据句柄从二级、三级结构句柄表中找到内核对象

    一 回顾 上一篇博客介绍了如何遍历一级句柄表 一级句柄表非常简单 xff0c 就是一个4KB页 xff0c 最多存储512个句柄表项 如果句柄数量在 512 1024 512 之间 xff0c 句柄表就是二级结构 xff1b 如果句柄数量大
  • BW:BW与第三方BI接口设计与实现:APD、Open Hub、RFM

    最近公司新上了国内某 CRM系统 xff0c SAP的 CRM也光荣下线了 但是紧接着就出现了一些需求 xff0c CRM自带一款小型 BI xff0c 需要一些 SD的数据 xff0c 但是把 R3的数据给他们进行计算的话 xff0c 不
  • Ubuntu下查看CPU、内存和硬盘详细信息的几个命令

    转载自https www cnblogs com shixiangwan p 7066085 html CPU xff1a 型号 xff1a grep 34 model name 34 proc cpuinfo awk F 39 39 39
  • python 小点心---execvp

    execvp会用即将运行的进程的内存替换掉调用进程的内存 xff0c 更进一步讲 xff0c 就是把当前进程的机器指令都清空 xff0c 然后载入被execvp运行起来的进程的机器指令 coding 61 utf 8 import os i
  • jenkins + gitlab + docker + harbor 实现自动触发更新

    当使用微服务方案后 xff0c 面临在大量的项目构建和部署工作 xff0c 借助于jenkins的持续集成 xff0c 可以快速把应用打包成docker镜像 xff0c 实现自动部署 xff0c 加快项目的迭代 一 环境部署 系统IP主机名
  • C++ -- STL文件解析

    1 STL文件格式 STL文件是一种用许多空间小三角形面片逼近三维实体表面的3D模型 STL模型给出了组成三角形法向量的3个分量 用于确定三角面片的正反方向 及三角形的3个顶点坐标 一个完整的STL文件记录了组成实体模型的所有三角形面片的法
  • Ubuntu 查看CPU信息

    Ubuntu 查看cpu个数及核心数 总核数 span class token operator 61 span 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 span class token operator 61 span
  • 韩顺平老师Java基础听课笔记(一)

    Java运行机制 xff1a 1 javac 编译 java文件 生成 class文件 javac Hello java 2 java运行编译后的 class文件 xff08 java Hello xff09 编译后可在Windows Li
  • 韩顺平老师 Java基础听课笔记(二)

    变量 xff1a xff08 先声明后使用 xff09 定义变量 xff1a 1 int a 61 1 2 int b b 61 2 变量在同一个作用域 xff08 同一个方法 xff09 内不能重名 变量三要素 xff1a 变量名 变量值
  • VScode上传到git仓库详细教程

    文章有点啰嗦 坚持看完 xff01 xff01 xff01 首先下载git https git scm com downloads 下载成功之后 xff0c 一直点击next直到安装成功 xff0c 在桌面上点击鼠标右键出现 点击Git B
  • [视觉测距]单目视觉定位测距的两种方式(1)

    单目定位和双目定位的选择 xff0c 我觉得主要还是成本和时间的考虑 之前也尝试过双目定位 xff0c 感觉要更精准些 xff0c 但双目测距需要对两幅图像进行图像变换和极线匹配 xff0c 稍微耗时了一些 这几天尝试了一下单摄像头进行测距
  • [学习SLAM]Quaternion 插值/ 用四元数插值来对齐IMU和图像帧

    小白 xff1a 师兄 xff0c 好久没见到你了啊 xff0c 我最近在看IMU xff08 Inertial Measurement Unit xff0c 惯性导航单元 xff09 相关的东西 xff0c 正好有问题求助啊 师兄 xff
  • 【学习SLAM】vins笔记

    VINS ROS source catkin ws devel setup bash 3 1 1 Open three terminals launch the vins estimator rviz and play the bag fi
  • CSDN 还是不能改头像!!!

    都好几个月了 xff0c 技术问题么 xff0c 还是爬梯开大会 xff0c 连这个都不让改了 真不爽
  • 【计算机视觉】opencv姿态解算6 理论算法调研 PNP问题 5种算法

    关于PnP xff08 pespective n point xff09 的一些方法 最小PnP问题 P3P问题中假设没有噪声 xff0c 使用几何约束 xff0c 可以解得相机的位姿 不具有唯一解 P4P问题中分为线性方法和基于P3P的方
  • 【计算机视觉】 相机姿态估计之标记检测-相机标定ArUco和ChArUco 5

    相机标定ArUco和ChArUco 原文来源 opencv http docs opencv org master da d13 tutorial aruco calibration html ArUco模块也可以用来相机标定 相机标定是获
  • 【泡泡机器人公开课】公开课链接 机器人俱乐部

    1 工业相机选型及介绍 刘富强 链接 https pan baidu com s 1nuGw4Vv 密码 tjag 2 深度学习及应用 颜沁睿 链接 https pan baidu com s 1c31ZcE 密码 r42j 3 SVO a
  • VINS简介与代码结构

    VINS Mono和VINS Mobile是香港科技大学沈劭劼团队开源的单目视觉惯导SLAM方案 是基于优化和滑动窗口的VIO xff0c 使用IMU预积分构建紧耦合框架 并且具备自动初始化 xff0c 在线外参标定 xff0c 重定位 x
  • 【学习SLAM】c++时间戳 获取与转换

    https tool lu timestamp c 43 43 时间戳 自 1970 年 1 月 1 日以来经过的秒数 time t time1 61 time 0 这里获取到的其实就是一个long类型的时间戳 xff0c 是秒级别 的 1