現在のグレゴリオ暦の日付と時刻をユリウス日に変換してから、グレゴリオ暦のゲートに戻すプログラムを作成しています。最終的には、年、月、日、時、分、秒を追加できる機能を追加する必要がありますが、最初にこの部分を取り除く必要があります。
今、私はグレゴリオ暦からユリウス暦への変換を行っているので、論理的には、何らかの形で方程式を元に戻すことができ、それはかなり簡単だと思います。ただし、最初にグレゴリオ暦の日付をユリウス日番号に変換し、次にユリウス日付に変換する 2 段階のプロセスを実行しています (日番号の違いには時間が含まれません)。したがって、それを元に戻すと、方程式から時間、分、秒を元に戻してから、ユリウス日番号をグレゴリオ暦に戻す別の変換を行う必要があることを意味するはずです。時間、分、秒を 3 回分割して変換する単純なプロセスだと思いたいのですが、通常、私は数学とこれらのことを論理的に考えるのが得意ですが、私の脳はこれについて機能していません。
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);
下半分は、時間、分、秒を取得できるようになったときに必要になる計算です。彼らがしているのは、ユリウス日番号をグレゴリオ暦に戻すことだけです。
wiki ページでは、ユリウス日について詳しく説明しています。
必要なことを十分に説明できたと思います!皆さんが提供できる助けをありがとう!