Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中两个日期之间的差异_C_Date - Fatal编程技术网

C中两个日期之间的差异

C中两个日期之间的差异,c,date,C,Date,我是C语言的初学者 有日期的数据类型吗 在C语言中,我们用时间来工作,也有日期的吗 如何计算两个日期之间的差异 您可以创建名为日期的结构,该结构包含以下字段 typedef struct { int day; int month; int year; }date; 这只是一个你想要的蓝图,现在做一个date的对象,并相应地工作。 要查找差异,请编写一个函数,分别在两个stuct的日月和年之间取差异 有日期的数据类型吗 不,在C中内置数据类型,您必须定义用户定义的数据类型 如何计算两个

我是C语言的初学者

  • 有日期的数据类型吗
  • 在C语言中,我们用时间来工作,也有日期的吗
  • 如何计算两个日期之间的差异

您可以创建名为日期的
结构,该结构包含以下字段

typedef struct 
{
 int day;
 int month;
 int year;
}date;
这只是一个你想要的蓝图,现在做一个
date
的对象,并相应地工作。 要查找差异,请编写一个函数,分别在两个stuct的
之间取差异

有日期的数据类型吗

不,在
C
中内置数据类型,您必须定义用户定义的数据类型

如何计算两个日期之间的差异

你可以试试这个:

struct dt
{
  int dd;
  int mm;
  int yy;
};
typedef dt date;  
在main()中,需要为类型
数据
声明三个变量
在下面的示例中,
今天的差异,
例如,您希望计算当前日期(
c_date
)和出生日期(
dob
)之间的差值

今天
中,两个日期之间存在差异

还有一种方法:
阅读以下答案:
1.
2.

是的,标准库包含您想要的结构和函数。您可以使用
struct tm
存储日期,使用
difftime
获取差异

是否有保存日期的数据类型

不,尽管对于“现在加上或减去几十年”范围内的日期,您可以使用
time\t
struct tm
包含相关日期午夜(例如)的日期时间。或者,你可以研究一个叫做“朱利安日”的东西:计算它,并将它存储在你喜欢的任何整数类型中

也有C语言库吗

标准函数都与日期/时间相关,而不仅仅是日期:
mktime
localtime
gmtime

struct tm date;
strptime( "2017-03-21", "%F", &date );

puts( asctime(&date) );  // Mon Mar 21 00:00:00 2017
如何计算两个日期之间的差异

一旦你在一个
时间中有了它
,你就可以将两者相减,然后除以86400。不过,请注意,由于夏令时的变化,两天的“午夜当地时间”可能不是24小时的精确倍数


如果您的实现需要一个超出
时间\u t
范围的日历,那么您基本上只能靠自己。如果
time\u t
是64位,那么这就超过了宇宙的年龄,但是如果
time\u t
是32位,这对历史没有好处。甚至还有养老金计划。历史应用程序对日历有自己的要求(朱利安日历,日历完全与格里高利无关)。

您必须定义一个日期结构:

typedef struct date {
    int day;
    int month;
    int year;
} Date;
然后定义一个简单的
date\u compare()
方法:

int date_compare(Date *date1, Date *date2) {

    if (date1->year != date2->year)
        return (date1->year - date2->year);
    if (date1->month != date2->month)
        return (date1->month - date2->month);
    return (date1->day - date2->day);

}
/*第3版(更好)
两个日期之间的日期差(以天为单位)
类似于VBA函数DateDiff(“d”,date1,date2)
如果是格里高利。和你一样的基本原则
可以翻译成许多其他语言。这
是带有日期有效性控制的完整C代码。
*/
#包括
void main(){
长d1、m1、y1、d2、m2、y2;
printf(“输入第一天、月、年”);
scanf(“%d%d%d”、&d1、&m1和&y1);
printf(“输入第二天、月、年”);
scanf(“%d%d%d”、&d2、&m2和&y2);
if((IsValid(d1,m1,y1)==0)|(IsValid(d2,m2,y2)==0)){
printf(“检测到无效日期\n”);
}否则{
d1=DatDif(d1,m1,y1,d2,m2,y2);
printf(“\n\n日期差为%d天\n”,d1);
}
}//端干管
长DatDif(d1、m1、y1、d2、m2、y2)
{龙苏玛;
suma=rbdug(d2,m2,y2)-rbdug(d1,m1,y1);
如果(y1!=y2){
if(y1
/*第4版(100%正确):
前公历日期差,以天为单位。
两个日期之间的日期差(以天为单位)
类似于VBA函数DateDiff(“d”,date1,date2)
更好(不受DateDiff的限制)
如果是格里高利。和你一样的基本原则
可以翻译成许多其他语言。这
是带有日期有效性控制的完整C代码。
*/
#包括
void main(){
长d1、m1、y1、d2、m2、y2;
printf(“输入第一天、月、年”);
scanf(“%d%d%d”、&d1、&m1和&y1);
printf(“输入第二天、月、年”);
scanf(“%d%d%d”、&d2、&m2和&y2);
if((IsValid(d1,m1,y1)==0)|(IsValid(d2,m2,y2)==0)){
printf(“检测到无效日期\n”);
}否则{
d1=DatDif(d1,m1,y1,d2,m2,y2);
printf(“\n\n日期差为%d天\n”,d1);
}
}//端干管
长DatDif(d1、m1、y1、d2、m2、y2)
{龙苏玛;
suma=rbdug(d2,m2,y2)-rbdug(d1,m1,y1);
如果(y1!=y2){
if(y1
日期和时间的标准C库选项非常差,而且
/*  Version 3 (better)
Date Difference between the two dates in days
like VBA function DateDiff("d", date1, date2)
in case of Gregorian. Same basic principle you
can translate in lot of other languages. This
is complete C code with date validity control.
*/

#include<stdio.h>

void main(){
  long d1,m1,y1,d2,m2,y2;
  printf("Enter first date day, month, year\n");
  scanf("%d%d%d",&d1,&m1,&y1);
  printf("Enter second date day, month, year\n");
  scanf("%d%d%d",&d2,&m2,&y2);
  if((IsValid(d1,m1,y1)==0)||(IsValid(d2,m2,y2)==0)){
    printf("Invalid date detected\n");
  }else{
    d1=DatDif(d1,m1,y1,d2,m2,y2);
    printf("\n\n Date difference is %d days\n",d1);
  }
}// end main

long DatDif(d1,m1,y1,d2,m2,y2)
{ long suma;
  suma=rbdug(d2,m2,y2) - rbdug(d1,m1,y1);
  if(y1 != y2){
    if(y1 < y2){
      suma+=Godn(y1,y2);
    }else{
      suma-=Godn(y2,y1);
    }
  }
  return(suma);
}// end DatDif

long Godn(yy1,yy2)
{ long jj,bb;
  bb=0;
  for(jj=yy1;jj<yy2;jj++){
    bb+=365;
    if(((((jj%400)==0)||((jj%100)!=0))
      &&((jj%4)==0))) bb+=1;
  }
  return(bb);
}// end Godn

//Day of the Year
long rbdug(d,m,y)
{ long a,r[13];
  r[1] = 0; r[2] = 31; r[3] = 59;
  r[4] = 90; r[5] = 120; r[6] = 151;
  r[7] = 181; r[8] = 212; r[9] = 243;
  r[10]= 273; r[11]= 304; r[12]= 334;
  a=r[m]+d;
  if(((((y%400)==0)||((y%100)!=0))
      &&((y%4)==0))&&(m>2)) a+=1;
  return(a);
}//end rbdug

//date validity
long IsValid(dd,mm,yy)
{ long v[13];
  if((0 < mm) && (mm < 13)){
    v[1] = 32; v[2] = 29; v[3] = 32;
    v[4] = 31; v[5] = 32; v[6] = 31;
    v[7] = 32; v[8] = 32; v[9] = 31;
    v[10]= 32; v[11]= 31; v[12]= 32;
    if(((((yy%400)==0)||((yy%100)!=0))
      &&((yy%4)==0))) v[2]+=1;
    if((0 < dd) && (dd < v[mm])){
      return(1);
    }else{
      return(0);
    }
  }else{
    return(0);
  }
}//end IsValid
/* Version 4 ( 100 % correct):
Proleptic Gregorian date difference in days.
Date Difference between the two dates in days
like VBA function DateDiff("d", date1, date2)
and better (without limitations of DateDiff)
in case of Gregorian. Same basic principle you
can translate in lot of other languages. This
is complete C code with date validity control.
*/

#include<stdio.h>

void main(){
  long d1,m1,y1,d2,m2,y2;
  printf("Enter first date day, month, year\n");
  scanf("%d%d%d",&d1,&m1,&y1);
  printf("Enter second date day, month, year\n");
  scanf("%d%d%d",&d2,&m2,&y2);
  if((IsValid(d1,m1,y1)==0)||(IsValid(d2,m2,y2)==0)){
    printf("Invalid date detected\n");
  }else{
    d1=DatDif(d1,m1,y1,d2,m2,y2);
    printf("\n\n Date difference is %d days\n",d1);
  }
}// end main

long DatDif(d1,m1,y1,d2,m2,y2)
{ long suma;
  suma=rbdug(d2,m2,y2) - rbdug(d1,m1,y1);
  if(y1 != y2){
    if(y1 < y2){
      suma+=Godn(y1,y2);
    }else{
      suma-=Godn(y2,y1);
    }
  }
  return(suma);
}// end DatDif

long Godn(yy1,yy2)
{ long jj,bb;
  bb=0;
  for(jj=yy1;jj<yy2;jj++){
    bb+=365;
    if(IsLeapG(jj)==1) bb+=1;
  }
  return(bb);
}// end Godn

//Day of the Year
long rbdug(d,m,y)
{ long a,r[13];
  r[1] = 0; r[2] = 31; r[3] = 59; r[4] = 90;
  r[5] = 120; r[6] = 151; r[7] = 181; r[8] = 212;
  r[9] = 243; r[10]= 273; r[11]= 304; r[12]= 334;
  a=r[m]+d;
  if((IsLeapG(y)==1)&&(m>2)) a+=1;
  return(a);
}//end rbdug

//date validity
long IsValid(dd,mm,yy)
{ long v[13];
  if((0 < mm) && (mm < 13)){
    v[1] = 32; v[2] = 29; v[3] = 32; v[4] = 31;
    v[5] = 32; v[6] = 31; v[7] = 32; v[8] = 32;
    v[9] = 31; v[10]= 32; v[11]= 31; v[12]= 32;
    if ((mm==2)&&(IsLeapG(yy)==1)) v[2]=30;
    if((0 < dd) && (dd < v[mm])){
      return(1);
    }else{
      return(0);
    }
  }else{
    return(0);
  }
}//end IsValid

//is leap year in Gregorian
long IsLeapG(yr){
  if(((((yr%400)==0)||((yr%100)!=0))&&((yr%4)==0))){
    return(1);
  }else{
    return(0);
  }
}//end IsLeapG
struct tm date;
strptime( "2017-03-21", "%F", &date );

puts( asctime(&date) );  // Mon Mar 21 00:00:00 2017
int main() {
    struct tm date1, date2;
    strptime( "2017-03-21", "%F", &date1 );
    strptime( "2018-01-20", "%F", &date2 );

    printf("%.0lf\n", difftime(mktime(&date1), mktime(&date2)));
}
// The formulas for a and m can be distilled down to these tables.
int Julian_A[12] = { 1, 1, 0 };
int Julian_M[12] = { 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

int julian_day( struct tm *date ) {
    int a = Julian_A[date->tm_mon];
    int m = Julian_M[date->tm_mon];
    int y = date->tm_year + 1900 + 4800 - a;

    return date->tm_mday + ((153*m + 2) / 5) + 365*y + y/4 - y/100 + y/400 - 32045;
}

int main() {
    struct tm date1, date2;
    strptime( "2017-03-21", "%F", &date1 );
    strptime( "2018-01-20", "%F", &date2 );

    // 305 days
    printf("%d days\n", julian_day(&date2) - julian_day(&date1));
}