• 70 QDateTime时间戳转换有误


    1 前言

            在开发工具中需要用时间戳转换成格式化时间来显示,但引用QT中自带的时间类QDateTime转换时,发现转换时间有误问题,转换的结果时分秒是正确的,但月份确实错误的。因此在未深入研究qt实现情况下,需要得到正确的格式化时间,需要另寻它法。

            本blog对该现象仅进行记录和给出“治标不治本的”解决方法。

    2 现象

            首先给QT环境下出常用的时间戳转换格式化时间的方法。

    1. QDateTime QDstarttime = QDateTime::fromTime_t(startTime); //时间戳非毫秒级
    2. QString strStartTime = QDstarttime.toString("yyyy-mm-dd hh:mm:ss");
    3. QDateTime QDstoptime = QDateTime::fromTime_t(stopTime); //时间戳非毫秒级
    4. QString strStopTime = QDstoptime.toString("yyyy-mm-dd hh:mm:ss");

            基于上述代码的转换,对于两个时间戳分别是:1663223732 和 2114352000。转换结果如下图示,时、分、秒是正确的,但是月份是错误的。

            对于时间戳的正确与否,特定通过在线转换工具来检验,如下图示,可知时间戳是没问题的。 

            1663223732

            2114352000:

             因此根据上述情况,很有理由怀疑qt时间转换函数有问题,但由于没有时间看qt源码,所以想要在qt环境得到正确的格式化时间,得需要用其它代码替换。

    3 解决方法(之一)

            本次的解决方案是,通过使用通用的时间函数,来避开使用QT的函数,从而实现正确的转换。

    1. time_t stime_t = startTime;
    2. struct tm *pstm = localtime(&stime_t);
    3. char tsBuf[128] = {0};
    4. sprintf(tsBuf, "%04d-%02d-%02d %02d:%02d:%02d",
    5. pstm->tm_year+1900, pstm->tm_mon+1,
    6. pstm->tm_mday, (pstm->tm_hour)%24, //时区问题
    7. pstm->tm_min,pstm->tm_sec);
    8. QString strStartTime(tsBuf);
    9. time_t etime_t = stopTime;
    10. struct tm *petm = localtime(&etime_t);
    11. char teBuf[128] = {0};
    12. sprintf(teBuf, "%04d-%02d-%02d %02d:%02d:%02d",
    13. petm->tm_year+1900, pstm->tm_mon+1,
    14. petm->tm_mday, (petm->tm_hour)%24, //时区问题
    15. petm->tm_min,petm->tm_sec);
    16. QString strStopTime(teBuf);

             用上述代码替换后,便可到正确的格式化时间。

    over!

  • 相关阅读:
    视频剪辑素材哪里找?这个几个网站就够了。
    An2021软件安装及基本操作(新建文件/导出)
    蓝桥杯每日一题2023.10.2
    无线充电器出口欧盟CE认证RED指令测试分析
    leetcode 416. Partition Equal Subset Sum 分割等和子集(中等)
    Mysql根据经纬度查询半径多少以内的数据,画个圈圈查数据库
    Linux初始化(下):从_start到第一个进程
    黏菌优化算法SMA(Matlab完整代码实现)
    websocket 爬虫探索新的网络机遇
    割草机器人芯片选型及各厂家产品对比
  • 原文地址:https://blog.csdn.net/Chasing_Chasing/article/details/126966179