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

所属分类: 软件编程 / C 语言 阅读数: 66
收藏 0 赞 0 分享

因工作需要,经常跟时间戳打交道,但是因为它仅仅是一个数字,我们很难直接看出它有什么意义,或两个时间戳之间究竟差了多长的间隔。于是从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++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多