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 】 【 网络技术251811 】 【 AI营销90571


相关推荐: Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  JS经典正则表达式笔试题汇总  WordPress 子目录安装中正确处理脚本路径的完整指南  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何用低价快速搭建高质量网站?  长沙做网站要多少钱,长沙国安网络怎么样?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  青岛网站建设如何选择本地服务器?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Laravel如何实现一对一模型关联?(Eloquent示例)  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  焦点电影公司作品,电影焦点结局是什么?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel中的Facade(门面)到底是什么原理  如何安全更换建站之星模板并保留数据?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Python文件操作最佳实践_稳定性说明【指导】  如何用AWS免费套餐快速搭建高效网站?  Python结构化数据采集_字段抽取解析【教程】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel PHP版本要求一览_Laravel各版本环境要求对照  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  EditPlus中的正则表达式 实战(1)  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  高端建站如何打造兼具美学与转化的品牌官网?  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  C#如何调用原生C++ COM对象详解  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Python数据仓库与ETL构建实战_Airflow调度流程详解  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  如何用虚拟主机快速搭建网站?详细步骤解析  如何在Ubuntu系统下快速搭建WordPress个人网站?  Android仿QQ列表左滑删除操作  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)