`

C语言 日期型转double型

c 
阅读更多

 

在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

 

 

分享到:
评论

相关推荐

    C语言日期型与double型互相转换

    在C语言中没有直接将日期转换为double型的函数,但是在将日期类型保存到文件时往往需要日期的转换。C语言日期型与double型互相转换。在VC6.0和VC2010下编译通过。C/C++时间日期与doub型相互转换。

    C语言基础学习ppt课件

    2. **数据类型**:C语言提供多种基本数据类型,如整型(int)、浮点型(float和double)、字符型(char)和布尔型(通过#define或枚举定义)。此外,还有复合数据类型如结构体和联合体,它们可以组合不同类型的数据...

    C语言编程笔记

    变量是存储数据的容器,C语言提供了多种数据类型,如整型(int)、浮点型(float、double)、字符型(char)等,以适应不同的数据需求。运算符则用于对这些变量进行操作,包括算术运算符、比较运算符、逻辑运算符...

    《实用C语言编程(第三版)》.pdf

    2. 数据类型:C语言提供了丰富的数据类型,如整型(int)、浮点型(float, double)、字符型(char)等,为程序员提供了灵活的数据处理能力。 3. 指针:指针是C语言中一个非常强大的特性,它允许直接访问内存地址,...

    有关C语言的课件资料,PPT形式

    1. 变量与数据类型:C语言提供了多种基本数据类型,包括整型(int)、浮点型(float、double)、字符型(char)以及布尔型(在某些库中定义)。变量是存储数据的容器,必须先声明后使用,声明时需要指定数据类型。 ...

    C语言例程:万年历

    2. 变量和数据类型:C语言中的基本数据类型包括整型(int)、字符型(char)和浮点型(float/double)。在万年历程序中,可能会用到整型变量来存储年、月、日和星期。 3. 条件语句:如`if...else`和`switch`,用于...

    C语言规范 ,命名规范

    1. **BOOL**:布尔型,通常用于表示逻辑值(真或假),在C语言中通常定义为`int`类型的一个别名,并将其值限定为0和1。 2. **BYTE**:无符号字符类型,通常表示一个字节(8位)的数据,范围通常是0到255。 3. **WORD...

    C语言实用程序200例(高清PDF)

    1. **基本数据类型**:C语言提供了包括整型(int)、浮点型(float、double)、字符型(char)等基本数据类型。这些数据类型用于存储不同类型的数据,例如整数、小数和单个字符。 2. **运算符**:C语言支持多种...

    门禁系统代码(C语言版).

    数据类型包括整型(int)、浮点型(float/double)、字符型(char)等。 2. 结构体:为了组合多种数据类型,我们可以定义结构体,如创建一个包含ID、姓名、权限等信息的用户结构体。 3. 函数:函数是实现特定功能的代码...

    c语言实验报告-结构体程序设计

    例如,实验中的`struct student`就是一个结构体类型,包含了学号`num`(整型int)、姓名`name`(字符数组char[10])、数学成绩`math_score`(双精度浮点型double)和计算机成绩`computer_score`(双精度浮点型double...

    10.29_C语言_

    2. **类型系统**:C语言支持多种数据类型,包括整型(如int)、浮点型(如float和double)、字符型(char)以及指针类型。 3. **函数**:C语言使用函数作为代码组织的基本单元。函数可以接受参数,返回值,并且可以...

    c语言的作业

    1. **数据类型**:C语言中的基本数据类型包括整型(int)、字符型(char)和浮点型(float或double)。这些数据类型有不同的存储大小和表示范围,学习者需要了解它们的特点并能正确使用。 2. **常量**:常量是不可改变的...

    C语言基础学习笔记zip

    在C语言中,我们首先会接触到基本的数据类型,如整型(int)、浮点型(float、double)、字符型(char)等。这些数据类型构成了程序处理信息的基础。变量是存储数据的容器,每种数据类型都有其对应的内存大小和取值...

    《 C语言复习专用 》

    首先,C语言的基础知识包括基本数据类型,如int、char、float和double等,它们代表整型、字符型、浮点型和双精度浮点型数据。了解这些数据类型及其范围是编写有效C程序的第一步。此外,还包括变量的声明、初始化和...

    C语言练习+答案.doc

    12. C语言中的数据类型包括整型(如int)、浮点型(如float、double)、字符型(如char)等,不包含逻辑型或日期型。 13. 整型数据在C语言中可以表示为二进制、八进制、十进制和十六进制形式。 14. 实型常数如5E...

    c语言大纲资料.txt

    C语言的标准库提供了丰富的函数库,用于标准输入输出(stdio.h)、字符串处理(string.h)、数学运算(math.h)、时间和日期处理(time.h)等,这些库函数极大地方便了程序员进行各类编程任务。 十四、错误处理和...

    C语言基础第二版

    C语言中四种基本数据类型为:整型、浮点型、指针和聚合类型(如数组和结构体)。所有的其他类型都是这四种基本类型的组合。其中,整型家族包括不同的整型数据类型,浮点类型则包括`float`和`double`,以及`long ...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

Global site tag (gtag.js) - Google Analytics