- 浏览: 139502 次
- 性别:
文章分类
最新评论
在C语言中没有直接将日期转换为double型的函数,但是在将日期类型保存到文件时往往需要日期的转换。
/* ************************************************************************************************************
* conversion between double type and datetime type
* wxz 2011-08-29
* Compiledby VC6.0and VC2010
**************************************************************************************************************/
/**********************************************
* EncodeDateTime.h
**********************************************/
#ifndef EncodeDateTime_H
#define EncodeDateTime_H
typedef unsigned short word;//unsigned two bytes
//convert datetime to double type
extern double EncodeDateTime(word year,word month,word day,word hour,word min,word sec,word msec); //convert double to datetime type
extern void DecodeDateTime(double dt,word *year,word *month,word *day,word *hour,word *min,word *sec,word *msec);
//extern char *DecodeDateTime(char* dtStr, double dt,word *year,word *month,word *day,word *hour,word *min,word *sec,word *msec);
#endif
/* ********************************************************
* conversion between double type and datetime type
* EncodeDateTime.c
***********************************************************/
#include <stdio.h>
#include "EncodeDateTime.h"
const int DateDelta = 693594;// Days between 1/1/0001 and 12/31/1899
const int HoursPerDay = 24;//hours per day
const int MinsPerHour = 60;//minutes per hour
const int SecsPerMin = 60;//seconds per minute
const int MSecsPerSec = 1000;//milliseconds per second
const double MinDateTime= -657434.0; // 01/01/0100 12:00:00.000 AM
const double MaxDateTime= 2958465.99999; // 12/31/9999 11:59:59.999 PM
void DivMod(int dividend,int divisor,word *result,word *remainder)
{
*result=dividend/divisor;
*remainder=dividend%divisor;
}
//convert datetime to double type
double EncodeDateTime(word year,word month,word day,word hour,word min,word sec,word msec)
{
const int MinsPerDay = HoursPerDay * MinsPerHour;//minutes per day
const int SecsPerDay = MinsPerDay * SecsPerMin; //seconds per day
const int SecsPerHour = SecsPerMin * MinsPerHour; //seconds per hour
const int MSecsPerDay = SecsPerDay * MSecsPerSec; //milliseconds per day
//
int i;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
double date;
double time;
date=0;
time=0;
if ((year >= 1) && (year <= 9999) && (month >= 1) && (month <= 12))
{
//leap year
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) days[2]=29;
if ((day >= 1) && (day <= days[month]))
{
for( i=1;i<=month-1;i++) day+=days[i];
year-=1;
date= year * 365 + year / 4 - year / 100 + year / 400 + day - DateDelta;
if ((hour < HoursPerDay) && (min < MinsPerHour) && (sec < SecsPerMin) && (msec < MSecsPerSec))
{
time = (hour * (MinsPerHour * SecsPerMin * MSecsPerSec) +
min * (SecsPerMin * MSecsPerSec) +
sec * MSecsPerSec +
msec);
time/=MSecsPerDay;
}
return date+time;
}
}
return 1; // 12/31/1899
}
//convert double to datetime type
void DecodeDateTime(double dt,word *year,word *month,word *day,word *hour,word *min,word *sec,word *msec)
{
const int MinsPerDay = HoursPerDay * MinsPerHour;//minutes per day
const int SecsPerDay = MinsPerDay * SecsPerMin; //seconds per day
const int SecsPerHour = SecsPerMin * MinsPerHour; //seconds per hour
const int MSecsPerDay = SecsPerDay * MSecsPerSec; //milliseconds per day
const int D1 = 365;
const int D4 = D1 * 4 + 1;
const int D100 = D4 * 25 - 1;
const int D400 = D100 * 4 + 1;
//
word y,m,d,r,temp;
word hh,mm,ss,mss;
char str[20]; //
int ipart;//integer part
double fpart;//float part
int date,time; //date and time
//int MinCount, MSecCount;
word MinCount, MSecCount;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ipart=0;
fpart=0;
y=0;m=0;d=0;r=0,temp=0;
hh=0;mm=0;ss=0;mss=0;
MinCount=0;
MSecCount=0;
if(!(dt< MinDateTime)||(dt >(int)MaxDateTime+1.0))
{
ipart=(int)(dt);
fpart=dt-ipart;
date=ipart+DateDelta;
time=(int)(MSecsPerDay*fpart);
//-------------------------decode date-------------------------
if (date<=0)
{
*year=1899;
*month=12;
*day=31;
*hour=0;
*min=0;
*sec=0;
*msec=0;
}
else
{
temp=date % 7 +1;
date-=1;
y=1;
while(date >= D400)
{
date-=D400;
y+=400;
}
DivMod(date,D100,&r,&d);
if (r==4)
{
r-=1;
d+=D100;
}
y+=r*100;
DivMod(d, D4, &r,&d);
y+=r*4;
DivMod(d,D1,&r,&d);
if (r==4)
{
r-=1;
d+=D1;
}
y+=r;
//leap year
if ((y % 4 == 0) && ((y % 100 != 0) || (y % 400 == 0))) days[2]=29;
m = 1;
while(1)
{
r=days[m];
if (d< r) break;
d-=r;
m+=1;
}
*year = y;
*month = m;
*day = d + 1;
}
//-------------decode time----------------------------------------
DivMod(time, SecsPerMin * MSecsPerSec, &MinCount, &MSecCount);
DivMod(MinCount, MinsPerHour, &hh, &mm);
DivMod(MSecCount, MSecsPerSec, &ss, &mss);
*hour=hh;
*min=mm;
*sec=ss;
*msec=mss;
}
}
/* ********************************************************
* Test.c
**********************************************************/
#include "EncodeDateTime.h"
#include <stdio.h>
int main()
{
word year,month,day,hour,min,sec,msec;
double dt;
char str[20];
dt=EncodeDateTime(2011,8,29,16,21,40,0);
DecodeDateTime(dt,&year,&month,&day,&hour,&min,&sec,&msec);
sprintf(str,"%04d%02d%02d%02d%02d%02d",year,month,day,hour,min,sec);
printf("%s ",str);
scanf(str);
return 0;
}
源代码:
http://download.csdn.net/detail/xinzheng_wang/3563465
发表评论
-
TC 3D模型绘图
2011-05-27 14:40 972/*这个程序用于描述一个用户给定方程的3D物体,用户可以通过键 ... -
C语言通过栈将十进制数转为八进制数
2011-07-07 19:00 1522//VC6.0下运行通过 #define STACK_INI ... -
C语言链队列的基本操作
2011-07-08 14:27 5256//链队列的初始化及入队出队操作,XP3+VC6.0 运行下通 ... -
VC2010 下安装OpenCV2.2
2011-07-14 15:18 1324VC2010 下安装OpenCV2.2成功 ... -
C++二分法查找算法
2011-07-29 10:35 1035/****************************** ... -
C++ 泛型基础
2011-08-10 16:52 837泛型的基本思想:泛型 ... -
关于VC2010工程中的ipch文件夹和sdf文件
2012-05-14 15:59 1018VC2010中新建一个项目会同时建立一个特别占用磁盘空间 ... -
VC include文件名不区分大小
2012-05-17 10:36 1013VC include文件名不区分大小写,Linux下C/ ... -
指定VC2010中菜单ID时偶尔出现的大小写自动转换问题
2012-05-17 11:37 1015VC2010指定菜单ID时遇到的一个奇怪问题如下:ID_ ... -
VC2010 工具栏按钮添加事件
2012-05-21 10:08 2985VC2010 工具栏按钮添加事件的方法有如下两种: 1 ... -
在MFC 的CView中显示IplImage
2012-05-22 11:29 2595在MFC 的CView中显示IplImage如下: / ... -
VC2010 代码字体及颜色设置
2012-05-23 16:12 1478菜单: 工具->选项->环境->字体 ... -
VC2010 菜单项自动展开
2012-05-25 16:43 962在VC2010中若某个子菜单的菜单项过多会自动收缩起来, ... -
VC 实现菜单项及工具栏按钮同步禁用与启用
2012-05-29 09:25 3516也许太简单了,搜了N久,问了N多人,都没有找到解决异常的办 ... -
VC2010 MFC多文档项目中在带滚动条的窗口中显示图像
2012-06-01 19:17 3327首先创建MFC多文档项目XXX。 在XXXDoc.h中 ...
相关推荐
在C语言中没有直接将日期转换为double型的函数,但是在将日期类型保存到文件时往往需要日期的转换。C语言日期型与double型互相转换。在VC6.0和VC2010下编译通过。C/C++时间日期与doub型相互转换。
2. **数据类型**:C语言提供多种基本数据类型,如整型(int)、浮点型(float和double)、字符型(char)和布尔型(通过#define或枚举定义)。此外,还有复合数据类型如结构体和联合体,它们可以组合不同类型的数据...
变量是存储数据的容器,C语言提供了多种数据类型,如整型(int)、浮点型(float、double)、字符型(char)等,以适应不同的数据需求。运算符则用于对这些变量进行操作,包括算术运算符、比较运算符、逻辑运算符...
2. 数据类型:C语言提供了丰富的数据类型,如整型(int)、浮点型(float, double)、字符型(char)等,为程序员提供了灵活的数据处理能力。 3. 指针:指针是C语言中一个非常强大的特性,它允许直接访问内存地址,...
1. 变量与数据类型:C语言提供了多种基本数据类型,包括整型(int)、浮点型(float、double)、字符型(char)以及布尔型(在某些库中定义)。变量是存储数据的容器,必须先声明后使用,声明时需要指定数据类型。 ...
2. 变量和数据类型:C语言中的基本数据类型包括整型(int)、字符型(char)和浮点型(float/double)。在万年历程序中,可能会用到整型变量来存储年、月、日和星期。 3. 条件语句:如`if...else`和`switch`,用于...
1. **BOOL**:布尔型,通常用于表示逻辑值(真或假),在C语言中通常定义为`int`类型的一个别名,并将其值限定为0和1。 2. **BYTE**:无符号字符类型,通常表示一个字节(8位)的数据,范围通常是0到255。 3. **WORD...
1. **基本数据类型**:C语言提供了包括整型(int)、浮点型(float、double)、字符型(char)等基本数据类型。这些数据类型用于存储不同类型的数据,例如整数、小数和单个字符。 2. **运算符**:C语言支持多种...
数据类型包括整型(int)、浮点型(float/double)、字符型(char)等。 2. 结构体:为了组合多种数据类型,我们可以定义结构体,如创建一个包含ID、姓名、权限等信息的用户结构体。 3. 函数:函数是实现特定功能的代码...
例如,实验中的`struct student`就是一个结构体类型,包含了学号`num`(整型int)、姓名`name`(字符数组char[10])、数学成绩`math_score`(双精度浮点型double)和计算机成绩`computer_score`(双精度浮点型double...
2. **类型系统**:C语言支持多种数据类型,包括整型(如int)、浮点型(如float和double)、字符型(char)以及指针类型。 3. **函数**:C语言使用函数作为代码组织的基本单元。函数可以接受参数,返回值,并且可以...
1. **数据类型**:C语言中的基本数据类型包括整型(int)、字符型(char)和浮点型(float或double)。这些数据类型有不同的存储大小和表示范围,学习者需要了解它们的特点并能正确使用。 2. **常量**:常量是不可改变的...
在C语言中,我们首先会接触到基本的数据类型,如整型(int)、浮点型(float、double)、字符型(char)等。这些数据类型构成了程序处理信息的基础。变量是存储数据的容器,每种数据类型都有其对应的内存大小和取值...
首先,C语言的基础知识包括基本数据类型,如int、char、float和double等,它们代表整型、字符型、浮点型和双精度浮点型数据。了解这些数据类型及其范围是编写有效C程序的第一步。此外,还包括变量的声明、初始化和...
12. C语言中的数据类型包括整型(如int)、浮点型(如float、double)、字符型(如char)等,不包含逻辑型或日期型。 13. 整型数据在C语言中可以表示为二进制、八进制、十进制和十六进制形式。 14. 实型常数如5E...
C语言的标准库提供了丰富的函数库,用于标准输入输出(stdio.h)、字符串处理(string.h)、数学运算(math.h)、时间和日期处理(time.h)等,这些库函数极大地方便了程序员进行各类编程任务。 十四、错误处理和...
C语言中四种基本数据类型为:整型、浮点型、指针和聚合类型(如数组和结构体)。所有的其他类型都是这四种基本类型的组合。其中,整型家族包括不同的整型数据类型,浮点类型则包括`float`和`double`,以及`long ...
《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...