C++时间戳转换成日期时间的步骤和示例代码

发布时间 - 2026-01-10 21:48:46    点击率:

因工作需要,经常跟时间戳打交道,但是因为它仅仅是一个数字,我们很难直接看出它有什么意义,或两个时间戳之间究竟差了多长的间隔。于是从MSDN for Visual Studio6上找到了时间戳转换成日期时间的算法。本文除介绍这一算法外,还提供一个示例代码。

1、将时间戳转换成一串32比特的二进制数。有些数字转换之后不够32位,则在前面补充0。这可通过windows自带的计算器完成。比如481522543转换成
0001 1100 1011 0011 0111 0011 0110 1111

2、根据下面格式转换各个字段为10进制数字
YYYY YYYM MMMD DDDD HHHH HMMM MMMS SSSS
0001 1100 1011 0011 0111 0011 0110 1111

Y = year = 0000 1110 = 14
M = month = 0000 0101 = 5
D = day = 0001 0011 = 19
H = hour = 0000 1110 = 14
M = minutes = 0001 1011 = 27
s = seconds = 0000 1111 = 15

注意最右边一位在从日期转换到时间戳的时候砍掉了,因此我们秒这一字段要在最右端加一个补充的0。本例中为 s = seconds = 0 0001 1110 = 30。也因为此,转换后日期时间的“秒”字段总是一个偶数:-)

3、特殊处理:

年这一字段从1980开始计算,因此要加上1980才是正确年份。
这样481522543最终转换成:1994/05/19 14: 27: 30

示例程序如下

 /* File name: ts2tm.c
 Converts an decimal timestamp to human-readable format
 by sillyboard(sillyboard@tom.com)
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct date_time
{
 short dt_year;
 short dt_month;
 short dt_day;
 short dt_hour;
 short dt_minute;
 short dt_second;
}dt;

short bits_per_field[6] = {7, 4, 5, 5, 6, 5};

int main(int argc, char** argv)
{
 long timestamp;
 int i, j;
 unsigned long mask = 0x80000000;
 short bit;
 int accum;
 short* walker;
 if (argc != 2)
 {
  fprintf(stderr, "Usage: %s decimal-timestamp/n", argv[0]);
  exit(1);
 }

 timestamp = atol(argv[1]);
 walker = &dt;
 for (i = 0; i < 6; i ++)
 {
  accum = 0;
  for (j = 0; j < bits_per_field[i]; j ++)
  {
   bit = (timestamp & mask) ? 1 : 0;
   if (bit)
   {
    accum += pow(2, bits_per_field[i] - 1 - j);
   }
   mask = mask >> 1;
  }
  *walker ++ = accum;
 }

 dt.dt_second <<= 1;

 printf("%s/t", argv[1]);
 printf("%d-%d-%d %d:%d:%d/n", dt.dt_year + 1980, dt.dt_month,
  dt.dt_day, dt.dt_hour, dt.dt_minute, dt.dt_second);
 return;
}

这篇文章暂时就介绍这么多,具体的大家可以参考以前的文章。


# C++  # 时间戳  # 日期时间  # c++打印封装每次打印前面加上时间戳问题  # C/C++实现重置文件时间戳  # 关于C++使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳问题  # C++ std::chrono库使用示例(实现C++ 获取日期  # 计时等功能)  # C++ 中时间与时间戳的转换实例详解  # C++时间戳转化操作实例分析【涉及GMT与CST时区转化】  # c++之time_t和struct tm及时间戳的正确使用方式  # 这一  # 转换成  # 才是  # 很难  # 这么多  # 是从  # 要在  # 仅仅是  # 因为它  # 这篇文章  # 自带  # 提供一个  # 则在  # 这可  # 差了  # 中为  # 有什么意义  # 格式转换  # 本例  # 找到了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Python图片处理进阶教程_Pillow滤镜与图像增强  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在云服务器上快速搭建个人网站?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  常州企业网站制作公司,全国继续教育网怎么登录?  香港服务器租用费用高吗?如何避免常见误区?  Python制作简易注册登录系统  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  ,怎么在广州志愿者网站注册?  如何快速生成专业多端适配建站电话?  在centOS 7安装mysql 5.7的详细教程  如何快速配置高效服务器建站软件?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  怎么用AI帮你设计一套个性化的手机App图标?  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  详解Oracle修改字段类型方法总结  高性能网站服务器配置指南:安全稳定与高效建站核心方案  制作公司内部网站有哪些,内网如何建网站?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  iOS验证手机号的正则表达式  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  长沙做网站要多少钱,长沙国安网络怎么样?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Thinkphp 中 distinct 的用法解析  油猴 教程,油猴搜脚本为什么会网页无法显示?  iOS正则表达式验证手机号、邮箱、身份证号等  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel观察者模式如何使用_Laravel Model Observer配置  如何在万网ECS上快速搭建专属网站?  大连 网站制作,大连天途有线官网?  如何用景安虚拟主机手机版绑定域名建站?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Linux系统命令中screen命令详解  大型企业网站制作流程,做网站需要注册公司吗?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  浅谈Javascript中的Label语句  如何在景安服务器上快速搭建个人网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  如何确保FTP站点访问权限与数据传输安全?  网站制作免费,什么网站能看正片电影?  公司网站制作需要多少钱,找人做公司网站需要多少钱?