Il est construit dans le type de date, struct tm. Juste à zéro les heures, les minutes et les secondes. Oui, vérifiez liés (le mien) réponses au bas de ma réponse. En effet, les "struct tm" n'est pas de "type", mais une bibliothèque de structure définie. Toutes les versions de C ne peut pas avoir cette bibliothèque. struct tm fait partie de la norme C car il y avait un. Bizarre environnements de l'absence de la bibliothèque C standard, mais ce n'est pas pertinente pour un début C programmeur. Si c'est ce que tu voulais dire, qualifier la réponse en tant que telle. Je crois que l'information fournie est assez utile pour répondre (au moins jusqu'à une certaine mesure). Il y a quelques réponses de la couverture de la bibliothèque C d'envisager pour l'avenir. Je vous serais reconnaissant si vous pouvez ajouter une nouvelle, plus susceptibles de répondre. Que me serait utile. Fait. Car la question n'est pas de spécifier la façon dont ils voulaient les dates comparable, j'ai évité le très salissant question d'essayer de diff par année, mois et jour et il s'est plutôt avec Julian Jours. Par exemple, votre code suppose mois de 30 jours, ce qui signifie que la réponse sera un jour ou deux. La véritable année/mois/jour code est beaucoup plus impliqué.
Oui,de la bibliothèque standard C de la Bibliothèque d' contient les structures et les fonctions que vous voulez.Vous pouvez utiliser struct tm pour stocker la date et l' difftime pour obtenir la différence.
Est-il un type de données pour enregistrer les dates?
Pas, bien que pour les dates dans la gamme "maintenant, plus ou moins quelques décennies", vous pouvez utiliser time_t ou struct tm contenant la date à (par exemple) à minuit le jour. Vous pouvez également regarder dans un truc qui s'appelle le "jour Julien": calculer et de stocker dans n'importe quelle type entier vous le souhaitez.
Est-il de la bibliothèque pour le C?
Les fonctions standard concernent toutes des dates et heures, plutôt que de simplement les dates: mktime, localtime, gmtime.
Comment puis-je calculer la différence entre deux dates
Une fois que vous l'avez dans un time_t vous pouvez soustraire les deux et diviser par 86400. Toutefois, prenez garde, car "l'heure locale de minuit" sur deux jours différents, peut-être pas un multiple exact de 24 heures d'intervalle en raison de modifications de l'heure d'été.
Si vous avez besoin d'un calendrier qui s'étend au-delà de la gamme de time_t sur votre mise en œuvre, alors vous êtes fondamentalement sur votre propre. Si time_t est de 64 bits, alors que c'est plus de l'âge de l'univers, mais si time_t est de 32 bits c'est pas bon pour l'histoire. Ou de planification de la retraite, même. Applications historiques ont leurs propres exigences sur les calendriers de toute façon (calendrier Julien, calendriers complètement étrangers à Grégorien).
Vous pouvez créer un struct nommé date ayant champs suivants
typedefstruct{int day;int month;int year;}date;
C'est juste un plan de ce que vous voulez , maintenant, faire et l'objet de la date et de travailler en conséquence.
Pour trouver la différence ,écrire une fonction pour faire une différence entre daymonth et year des deux stucts respectivement.
Ce serait de retour la différence de en années, en mois ou jours, ce qui est assez.... inutile. Si le code doit comparer l'ordre de dates, comme une fonction de comparaison pour qsort(), cet extrait de code est bien raisonnable dates.
La bibliothèque standard C options pour les dates et heures sont assez pauvres et chargé avec des mises en garde et limites. Si possible, utiliser une bibliothèque comme Gnome Lib qui offre des GDate et très utiles fonctions de date et heure. Cela comprend g_date_days_between() pour obtenir le nombre de jours entre deux dates.
Le reste de cette réponse se limite à la bibliothèque standard C, mais si vous n'avez pas à vous limiter à la norme, ne te torture pas. Les Dates sont étonnamment difficile.
Est-il un type de données pour les dates?
struct tm va servir. Il suffit de laisser l'heure, les minutes et les secondes au 0.
Façon la plus simple de s'assurer que tous les champs de struct tm sont correctement enfichés est d'utiliser strptime.
Mais ce n'est pas un excellent moyen de stocker des dates. Il s'avère qu'il est préférable d'utiliser les Jours de Julien (voir ci-dessous).
En C, nous avons pour travailler avec le temps, est-il un pour les dates trop?
Si vous faites allusion à l' time_t, c'est aussi pour la date et l'heure. C'est le nombre de secondes depuis le "à l'époque" qui est 1970-01-01 00:00:00 UTC, le système POSIX, mais pas nécessairement d'autres. Malheureusement, sa plage est seulement en 1970 à 2037, même si une version récente d'un système d'exploitation ont considérablement élargi la gamme.
Comment puis-je calculer la différence entre deux dates?
Dépend de ce que vous voulez. Si vous souhaitez que le nombre de secondes, vous pouvez convertir le struct tm à time_t à l'aide de mktime et ensuite utiliser difftime, mais qui est limité à la 1970-2037 plage de time_t.
Si vous souhaitez que le nombre de jours, vous feriez convertir les dates en jours Julien, le nombre de jours depuis le 24 novembre 4714 colombie-britannique, et de soustraction. Tout cela peut sembler ridicule, ce relativement simple formule prend avantage du calendrier des cycles et n'utilise que des math entier.
//The formulas for a and m can be distilled down to these tables.intJulian_A[12]={1,1,0};intJulian_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));}
Il y a d'autres formules simples pour la conversion entre les Dates Juliennes et les dates du calendrier.
Se diff en années, en mois et en jours est difficile à cause du nombre de jours dans un mois varie selon le mois et l'année, et parce qu'il a besoin d'être normalisée. Par exemple, vous ne diriez pas 2 ans, -1 mois, 2 jours. Vous dirais 1 an, 11 mois, 29 jours (ou peut-être 28, dépend du mois). Pour cette raison, ne date mathématiques dans les Jours de Julien à chaque fois que possible.
/* 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 mainlongDatDif(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 DatDiflongGodn(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 Yearlong 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 validitylongIsValid(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 mainlongDatDif(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 DatDiflongGodn(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 Yearlong 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 validitylongIsValid(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 GregorianlongIsLeapG(yr){if(((((yr%400)==0)||((yr%100)!=0))&&((yr%4)==0))){return(1);}else{return(0);}}//end IsLeapG
Pourriez-vous consolider toutes ces en une seule réponse, s'il vous plaît?
Pas, intégré le type de données dans
C
, vous avez défini type de données utilisateur.Vous pouvez essayer ceci:
Dans main (), vous devez déclarer trois variables de type
data
.Dans l'exemple suivant
today
différence,par exemple, on veut prendre de la différence entre la date actuelle (
c_date
) et la date de naissance (dob
)Dans
today
vous avez de la différence entre deux dates.Il existe un autre moyen:
double difftime (time_t fin, time_t début);
Lire cet réponses:
1. Comment comparer deux horodatage au format “Mois de la Date hh:mm:ss"
2. Comment trouvez-vous la différence entre deux dates en heures, en C?
struct tm
. Juste à zéro les heures, les minutes et les secondes.Oui, vérifiez liés (le mien) réponses au bas de ma réponse. En effet, les "
struct tm
" n'est pas de "type", mais une bibliothèque de structure définie. Toutes les versions de C ne peut pas avoir cette bibliothèque.struct tm
fait partie de la norme C car il y avait un. Bizarre environnements de l'absence de la bibliothèque C standard, mais ce n'est pas pertinente pour un début C programmeur. Si c'est ce que tu voulais dire, qualifier la réponse en tant que telle.Je crois que l'information fournie est assez utile pour répondre (au moins jusqu'à une certaine mesure). Il y a quelques réponses de la couverture de la bibliothèque C d'envisager pour l'avenir. Je vous serais reconnaissant si vous pouvez ajouter une nouvelle, plus susceptibles de répondre. Que me serait utile.
Fait. Car la question n'est pas de spécifier la façon dont ils voulaient les dates comparable, j'ai évité le très salissant question d'essayer de diff par année, mois et jour et il s'est plutôt avec Julian Jours. Par exemple, votre code suppose mois de 30 jours, ce qui signifie que la réponse sera un jour ou deux. La véritable année/mois/jour code est beaucoup plus impliqué.
OriginalL'auteur Grijesh Chauhan
Oui,de la bibliothèque standard
C de la Bibliothèque d'
contient les structures et les fonctions que vous voulez.Vous pouvez utiliserstruct tm
pour stocker la date et l'difftime
pour obtenir la différence.OriginalL'auteur prehistoricpenguin
Pas, bien que pour les dates dans la gamme "maintenant, plus ou moins quelques décennies", vous pouvez utiliser
time_t
oustruct tm
contenant la date à (par exemple) à minuit le jour. Vous pouvez également regarder dans un truc qui s'appelle le "jour Julien": calculer et de stocker dans n'importe quelle type entier vous le souhaitez.Les fonctions standard concernent toutes des dates et heures, plutôt que de simplement les dates:
mktime
,localtime
,gmtime
.Une fois que vous l'avez dans un
time_t
vous pouvez soustraire les deux et diviser par 86400. Toutefois, prenez garde, car "l'heure locale de minuit" sur deux jours différents, peut-être pas un multiple exact de 24 heures d'intervalle en raison de modifications de l'heure d'été.Si vous avez besoin d'un calendrier qui s'étend au-delà de la gamme de
time_t
sur votre mise en œuvre, alors vous êtes fondamentalement sur votre propre. Sitime_t
est de 64 bits, alors que c'est plus de l'âge de l'univers, mais sitime_t
est de 32 bits c'est pas bon pour l'histoire. Ou de planification de la retraite, même. Applications historiques ont leurs propres exigences sur les calendriers de toute façon (calendrier Julien, calendriers complètement étrangers à Grégorien).OriginalL'auteur Steve Jessop
Vous pouvez créer un
struct
nommé date ayant champs suivantsC'est juste un plan de ce que vous voulez , maintenant, faire et l'objet de la
date
et de travailler en conséquence.Pour trouver la différence ,écrire une fonction pour faire une différence entre
day
month
etyear
des deux stucts respectivement.OriginalL'auteur Omkant
Vous devez définir une date struct:
Et définir ensuite un simple
date_compare()
méthode:Si le code doit comparer l'ordre de dates, comme une fonction de comparaison pour
qsort()
, cet extrait de code est bien raisonnable dates.OriginalL'auteur martynas
La bibliothèque standard C options pour les dates et heures sont assez pauvres et chargé avec des mises en garde et limites. Si possible, utiliser une bibliothèque comme Gnome Lib qui offre des GDate et très utiles fonctions de date et heure. Cela comprend
g_date_days_between()
pour obtenir le nombre de jours entre deux dates.Le reste de cette réponse se limite à la bibliothèque standard C, mais si vous n'avez pas à vous limiter à la norme, ne te torture pas. Les Dates sont étonnamment difficile.
struct tm
va servir. Il suffit de laisser l'heure, les minutes et les secondes au 0.Façon la plus simple de s'assurer que tous les champs de
struct tm
sont correctement enfichés est d'utiliserstrptime
.Mais ce n'est pas un excellent moyen de stocker des dates. Il s'avère qu'il est préférable d'utiliser les Jours de Julien (voir ci-dessous).
Si vous faites allusion à l'
time_t
, c'est aussi pour la date et l'heure. C'est le nombre de secondes depuis le "à l'époque" qui est 1970-01-01 00:00:00 UTC, le système POSIX, mais pas nécessairement d'autres. Malheureusement, sa plage est seulement en 1970 à 2037, même si une version récente d'un système d'exploitation ont considérablement élargi la gamme.Dépend de ce que vous voulez. Si vous souhaitez que le nombre de secondes, vous pouvez convertir le
struct tm
àtime_t
à l'aide demktime
et ensuite utiliserdifftime
, mais qui est limité à la 1970-2037 plage detime_t
.Si vous souhaitez que le nombre de jours, vous feriez convertir les dates en jours Julien, le nombre de jours depuis le 24 novembre 4714 colombie-britannique, et de soustraction. Tout cela peut sembler ridicule, ce relativement simple formule prend avantage du calendrier des cycles et n'utilise que des math entier.
Il y a d'autres formules simples pour la conversion entre les Dates Juliennes et les dates du calendrier.
Se diff en années, en mois et en jours est difficile à cause du nombre de jours dans un mois varie selon le mois et l'année, et parce qu'il a besoin d'être normalisée. Par exemple, vous ne diriez pas 2 ans, -1 mois, 2 jours. Vous dirais 1 an, 11 mois, 29 jours (ou peut-être 28, dépend du mois). Pour cette raison, ne date mathématiques dans les Jours de Julien à chaque fois que possible.
Pour avoir une idée de ce que cela implique, PHP implémente ce que
date_diff
. Jetez un oeil à la quantité de C code requis.OriginalL'auteur Schwern
OriginalL'auteur Eagle11
OriginalL'auteur Darijo11