文章目录

  • 1 需求分析
  • 1.1 时间的表示规则
  • 1.2 Excel中浮点数与日期时间的相互转换
  • 2 程序设计
  • 2.1 调试环境
  • 2.2 源码
  • 3 运行结果


1 需求分析

1.1 时间的表示规则

C语言中,把日期和时间表示成一个浮点数(小数),便于日期计算。

正如 @阁云 在 日期的原型是浮点数 这篇博客中介绍的那样,参照时间为 1900/01/01 00:00:00。

比如 39819.440972222219 的整数部分 39819 表示当前日期距参照时间1900/01/01 的天数,而小数部分则表示不满一天,将其乘以 24 则表示小时数,再乘以 60 就表示分钟数。需要指出的是原博客中写作“乘以 60 则表示小时数” ,应为错误。按照上述规则,该浮点数表示 2009/1/6 10:35:00

1.2 Excel中浮点数与日期时间的相互转换

参考 @wb175208 的博客 C++ double类型的数转换成具体的日期和时间,在 Excel 中可以轻松实现上述转换

  1. 在Excel中输入39819.440972222219
  2. android 小数点变成整数文本格式 小数点数字转化为日期_时间戳


  3. 设置格式
  4. 转换结果 2009/1/6 10:35:00
  5. 同样的道理,日期也可以转换成浮点数,比如 2008/6/4 15:46:56 5.设为数字格式 39603.6575925926
    虽然 Excel 转换方便,但如果有大量数据需要转换或者需要自动转换,则需要编写程序。

下面参考 @wb175208 的博客 C++ double类型的数转换成具体的日期和时间 给出 C 语言 的转换程序。

2 程序设计

2.1 调试环境

  • Win 10
  • VS 2013

2.2 源码

#include <iostream>
//需要添加C语言时间头文件
#include<time.h>

// 时间转换程序
char* oleTime2Str(double time) 
{
	//2209190400 :指的是1900年1月1日-1970年1月1日的时间秒数
	//源程序中没有 +0.1 但是输出时间会存在1秒的误差,有朋友知道原因请指教
	time_t t = time * 24 * 3600 + 0.1 - 2209190400;
	struct tm tm1;
	localtime_s(&tm1, &t);

	//512 的功能不清楚,有朋友知道请指教
	char sz[512]; 
	memset(sz, 0, 512);
	//设置输出时间格式
	sprintf_s(sz,  "%02d/%02d/%04d %02d:%02d:%02d", tm1.tm_mon + 1, tm1.tm_mday,  tm1.tm_year + 1900, tm1.tm_hour, tm1.tm_min, tm1.tm_sec);
	return sz;
}


//主程序
int main()
{
	//从2009/1/6 10:35:00开始每个5分钟输出一个时间
	for (int i = 1; i <= 100; i++)
	{
		printf("%3d   %s  \n", i, oleTime2Str(39819.440972222219 + i * 300 / 86400.0));
	}		
	system("pause");
	return 0;
}

3 运行结果

android 小数点变成整数文本格式 小数点数字转化为日期_android 小数点变成整数文本格式_02


在Debug时,有时会出现这种结果,不知道什么原因,但在Release时,就没有这一问题:

android 小数点变成整数文本格式 小数点数字转化为日期_时间戳_03