【C】01 浮点数转换成日期时间格式

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. 设置格式
    在这里插入图片描述
  3. 转换结果 2009/1/6 10:35:00
    在这里插入图片描述
  4. 同样的道理,日期也可以转换成浮点数,比如 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()
{
    
    
	//从2019/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 运行结果

在这里插入图片描述
在Debug时,有时会出现这种结果,不知道什么原因,但在Release时,就没有这一问题:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43012724/article/details/107747688