文章目录
- 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 中可以轻松实现上述转换
- 在Excel中输入
39819.440972222219
- 设置格式
- 转换结果
2009/1/6 10:35:00
- 同样的道理,日期也可以转换成浮点数,比如
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 运行结果
在Debug时,有时会出现这种结果,不知道什么原因,但在Release时,就没有这一问题: