私はCの初心者です。
- 日付のデータ型はありますか?
- C では、時間を扱うためのものがありますが、日付用のものもありますか?
- 2 つの日付の差を計算するにはどうすればよいですか?
はい、標準ライブラリC Time Library
には必要な構造と関数が含まれています。struct tm
日付を保存difftime
して差を取得するために使用できます。
保存日のデータ型はありますか?
いいえ、「現在プラスまたはマイナス数十年」の範囲の日付の場合は、関連する日の真夜中などに日時を使用time_t
または含めることができます。struct tm
または、「ユリウス日」と呼ばれるものを調べることもできます。それを計算して、好きな整数型に格納します。
C用のライブラリもありますか?
標準関数はすべて、日付だけでなく日付/時刻に関連しています: mktime
、localtime
、gmtime
.
2つの日付の違いを計算するにはどうすればよいですか
2 を差し引いてtime_t
86400 で割ります。ただし、2 つの異なる日の「午前 0 時」の現地時間は、夏時間の変更により 24 時間の正確な倍数ではない可能性があるため、注意してください。
実装の範囲を超えるカレンダーが必要な場合は、time_t
基本的には自分で行う必要があります。64ビットならtime_t
宇宙の年齢以上ですが、time_t
32ビットなら歴史には不向きです。または年金計画、さらには。とにかく、歴史的なアプリケーションには、カレンダーに対する独自の要求があります (ユリウス暦、グレゴリオ暦とはまったく関係のないカレンダー)。
日付のデータ型はありますか?
いいえ、組み込みC
のデータ型です。ユーザー定義のデータ型を定義する必要があります。
2 つの日付の差を計算するにはどうすればよいですか?
これを試すことができます:
struct dt
{
int dd;
int mm;
int yy;
};
typedef dt date;
main() では、 type の 3 つの変数を宣言する必要がありますdata
。
次の例today
の違いでは、たとえば、現在の日付 ( ) と生年月日( )
の違いを取得したいc_date
dob
date dob,c_date,today;
if(c_date.dd>=dob.dd)
today.dd = c_date.dd-dob.dd;
else
{
c_date.dd+=30;
c_date.mm-=1;
today.dd = c_date.dd-dob.dd;
}
if(c_date.mm>=dob.mm)
today.mm = c_date.mm-dob.mm;
else
{
c_date.mm+=12;
c_date.yy-=1;
today.mm = c_date.dd-dob.mm;
}
today.yy = c_date.yy-dob.yy;
2today
つの日付に違いがあります。
もう 1 つの方法があり
ます: この回答を読んでください:
1. 「月日 hh:mm:ss」形式の 2 つのタイムスタンプを比較
する方法double difftime (time_t end, time_t beginning);
日付構造体を定義する必要があります。
typedef struct date {
int day;
int month;
int year;
} Date;
date_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);
}
次のフィールドを持つstruct
名前付きの日付を作成できます
typedef struct
{
int day;
int month;
int year;
}date;
それはあなたが望むものの単なる青写真であり、date
それに応じて作成およびオブジェクト化して動作します。違いを見つけるには、両方のスタックのday
month
との違いをそれぞれ取得する関数を記述します。year
/* 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
/* 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