Je suis en train d'écrire un programme qui doit convertir la date et l'heure grégorienne actuelle en une date julienne, puis revenir à la porte grégorienne. Finalement, je devrai ajouter la fonctionnalité de pouvoir ajouter des années, des mois, des jours, des heures, des minutes et des secondes, mais je dois d'abord éliminer cette partie.Conversion de la date grégorienne en date julienne puis de retour (avec le temps)
Maintenant j'ai la conversion de la date grégorienne à la date julienne, donc logiquement, je pense que je devrais simplement pouvoir inverser l'équation d'une façon ou d'une autre et que ce serait assez simple. Cependant, je suis en train de faire un processus en deux étapes où je convertis d'abord la date grégorienne en un nombre julien, puis une date julienne (la différence étant le nombre de jours ne comprend pas le temps). Donc, la conversion devrait juste signifier que je dois récupérer les heures, les minutes et les secondes de l'équation, et ensuite faire la conversion séparée pour le numéro du jour julien en date grégorienne. Je voudrais penser que c'est un processus simple de diviser et de moduler 3 fois pendant des heures, des minutes et des secondes, et normalement je suis assez bon en maths et en pensant ces choses logiquement, mais mon cerveau ne fonctionne tout simplement pas.
jdn_t gregorian_to_jd(year_t year, month_t month, day_t day, hour_t hour, minute_t minute, second_t second)
{
//implement the conversion from gregorian to jdn
long long a = (14 - month)/12;
long long y = year + 4800 - a;
long long m = month + 12*a - 3;
jdn_t jdn = day + (153 * m + 2)/5 + 365*y + y/4 - y/100 + y/400 - 32045 - 0.5;
jdnt_t jdnt = jdn + (hour-12)/24 + minute/1440 + second/86400;
}
void jdn_to_gregorianTime(jdnt_t jdnt,year_t & year, month_t & month, day_t & day, hour_t & hour, minute_t & minute, second_t & second)
{
long long j = static_cast<long long>(jdnt + 0.5) + 32044;
long long g = j/146097;
long long dg = j % 146097;
long long c = (dg/36524 + 1) * 3/4;
long long dc = dg - c * 36524;
long long b = dc/1461;
long long db = dc % 1461;
long long a = (db/365 + 1) *3/4;
long long da = db - a * 365;
long long y = g * 400 + c * 100 + b * 4 + a;
long long m = (da * 5 + 308)/153 - 2;
long long d = da - (m+4) * 153/5 + 122;
year = y - 4800 + (m + 2)/12;
month = (m + 2) % 12 + 1;
day = static_cast<day_t>(d + 1);
La moitié inférieure, il y a les calculs dont je aurai besoin une fois que je suis en mesure de sortir mes heures, minutes et secondes. Tout ce qu'ils font est de remettre le numéro du jour julien à la date grégorienne.
La page wiki explique toute chose ce jour pour ceux qui julian ne sont pas farmiliar: http://en.wikipedia.org/wiki/Julian_day
J'espère que je l'ai expliqué ce que je dois assez bien! Merci pour toute aide que vous pouvez offrir!
Le [Boost Date_Time] (http://www.boost.org/doc/libs/1_51_0/doc/html/date_time.html) bibliothèque fait déjà tout cela. –
Vous pourriez utiliser ou adapter le code C++ lié en bas de [cette page] (http://emr.cs.iit.edu/~reingold/calendars.shtml). C'est par Edward M. Reingold, l'un des auteurs de Calendrical Calculations. – Blastfurnace