3

現在のグレゴリオ暦の日付と時刻をユリウス日に変換してから、グレゴリオ暦のゲートに戻すプログラムを作成しています。最終的には、年、月、日、時、分、秒を追加できる機能を追加する必要がありますが、最初にこの部分を取り除く必要があります。

今、私はグレゴリオ暦からユリウス暦への変換を行っているので、論理的には、何らかの形で方程式を元に戻すことができ、それはかなり簡単だと思います。ただし、最初にグレゴリオ暦の日付をユリウス日番号に変換し、次にユリウス日付に変換する 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 ページでは、ユリウス日について詳しく説明しています

必要なことを十分に説明できたと思います!皆さんが提供できる助けをありがとう!

4

3 に答える 3

3

この無料のオープン ソース C++11/14 日付/時刻ライブラリは、この基盤を使用して、すべてのカレンダーとUnix Timeとの間の変換を設定することにより、任意<chrono>の 2 つのカレンダー間の変換を容易にします。

ユリウス暦と、グレゴリオ暦の 2 つのバリアント ({年、月、日} および {年、月、曜日、インデックス})、ISO 週ベースの暦、および (不完全な) イスラム暦があります。 . カレンダーは比較的簡単に追加できます。一度追加すると、カレンダーは他のすべてのカレンダーと相互運用でき、任意<chrono>system_clock::time_point精度で使用できます。

コード例:

#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};
}

出力:

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

基礎となるアルゴリズムの詳細が必要な場合は、ここで説明 (および証明) されています。

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

于 2016-10-11T15:05:25.933 に答える
0

これは、フル タイムが hhmmss 形式で返される 1 つのソリューションですが、個別に取得します。//hours: secs/3600 % 24、min: secs/60 % 60、secs secs % 60 で関数の最後を参照してください。

unsigned JulianToTime(double julianDate) { double 剰余 = julianDate - (unsigned)julianDate;

 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; 

}

于 2013-12-11T08:41:34.213 に答える