2012-10-12 3 views
1

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!

+0

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. –

+0

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

Répondre

0

Ceci est une solution où le temps plein est retourné au format hhmmss mais vous les obtenez sperately. Voir la fin de la fonction à // heures: secondes/3600% 24, min: sec/60% 60% 60 secs secs

unsigned JulianToTime (Double julianDate) { à double reste = julianDate - (unsigned)Date julienne;

const unsigned long long base = 1000000; 
const unsigned long long halfbase = 500000; 
const unsigned secsPerDay = 86400; 

// "rounded" remainder after adding half a day 
unsigned long long rndRemainder = (unsigned long long)(remainder * base + halfbase) % base; 

rndRemainder *= secsPerDay; 

// "rounded" number of seconds 
unsigned long long nsecs = (rndRemainder + halfbase)/base; 

//hours: secs/3600 % 24, min: secs/60 % 60, secs secs % 60 
unsigned rtn = (nsecs/3600 % 24) * 10000 + (nsecs/60 % 60) * 100 + (nsecs % 60); 
return rtn; 

}

1

Vous pouvez simplement utiliser cette bibliothèque. http://www.iausofa.org/current_C.html Ou obtenir un aperçu en regardant juste et en utilisant les concepts. Je l'ai déjà utilisé et c'est assez simple. Il y a beaucoup de pointeurs, alors préparez-vous. Celui que je connais est cal2jd et l'autre est jd2cal. Ceux-ci vous obtenez les dates. Il y en a plus pour le temps et le formatage. Il a quelques exemples dans les docs. Et si vous êtes si incliné à vouloir C++ alors il ya http://www.naughter.com/aa.html qui a des fonctions pour les calculs astronomiques. Bonne chance! Quelques autres ressources ... http://129.79.46.40/~foxd/cdrom/musings/formulas/formulas.htm

http://robm.fastmail.fm/articles/date_class.html

https://www.autoitscript.com/forum/topic/182372-standalone-moon-phase-calculation/

What are the default values taken (say 1721119) to calculate the Gregorian Year, Month, Day from Julian Day

http://www.projectpluto.com/source.htm

1

Cette free, open source C++11/14 date/time library utilise la <chrono> fondation pour faciliter les conversions entre les deux calendriers par la mise en place convers ons de tous les calendriers à et à partir de Unix Time. Il lui arrive d'avoir un calendrier julien ainsi que deux variantes du calendrier grégorien ({année, mois, jour} et {année, mois, jour de semaine, index}), le calendrier de la semaine ISO, et un (imparfait) Calendrier islamique. Les calendriers sont relativement facilement ajoutés, et une fois ajouté, un calendrier est interopérable avec tous les autres calendriers, et <chrono>system_clock::time_point à n'importe quelle précision.

code Exemple:

#include "date.h" 
#include "julian.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date::literals; 
    auto ymd = 2016_y/oct/11; 
    auto jymd = julian::year_month_day{ymd}; 
    auto ymd2 = date::year_month_day{jymd}; 
    std::cout << ymd << '\n'; 
    std::cout << jymd << '\n'; 
    auto ymd2 = date::year_month_weekday{jymd}; 
} 

qui sort:

2016-10-11 
2016-09-28 
2016/Oct/Tue[2] 

Si vous souhaitez plus de détails sur les algorithmes sous-jacents, ils sont discutés (et éprouvée) ici:

http://howardhinnant.github.io/date_algorithms.html

Questions connexes