C++ 将公历日期转换为朱利安日期,然后再转换(随时间)

C++ 将公历日期转换为朱利安日期,然后再转换(随时间),c++,date,gregorian-calendar,date-conversion,C++,Date,Gregorian Calendar,Date Conversion,我正在编写一个程序,必须将当前的公历日期和时间转换为儒略日期,然后返回到公历门。最终,我需要添加能够添加年、月、日、小时、分钟和秒的功能,但我需要先解决这部分问题 现在我有了从公历日期到朱利安日期的转换,所以逻辑上我觉得我应该能够以某种方式逆转这个等式,这将是相当简单的。但是我要做一个两步的过程,首先将公历日期转换为儒略日数,然后转换为儒略日差,因为日数不包括时间。所以把它转换回来应该意味着我必须从方程中得到小时,分钟和秒,然后把朱利安日数单独转换回公历日期。我想这是一个简单的划分和修改3次的过

我正在编写一个程序,必须将当前的公历日期和时间转换为儒略日期,然后返回到公历门。最终,我需要添加能够添加年、月、日、小时、分钟和秒的功能,但我需要先解决这部分问题

现在我有了从公历日期到朱利安日期的转换,所以逻辑上我觉得我应该能够以某种方式逆转这个等式,这将是相当简单的。但是我要做一个两步的过程,首先将公历日期转换为儒略日数,然后转换为儒略日差,因为日数不包括时间。所以把它转换回来应该意味着我必须从方程中得到小时,分钟和秒,然后把朱利安日数单独转换回公历日期。我想这是一个简单的划分和修改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页面为那些不是farmiliar的人解释了朱利安约会的全部内容:


我希望我已经充分解释了我需要什么!谢谢你们的帮助

这是一种解决方案,其中完整时间以hhmmss格式返回,但您可以得到它们。请参见中函数的结尾 //小时:秒/3600%24,分钟:秒/60%60,秒%60

未签名JulianToTimedouble 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; 

}

这是一种解决方案,其中完整时间以hhmmss格式返回,但您可以得到它们。请参见中函数的结尾 //小时:秒/3600%24,分钟:秒/60%60,秒%60

未签名JulianToTimedouble 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; 

}

您可以使用这个库。 或者通过查看并使用这些概念获得一些见解。 我以前用过它,它非常简单。尽管有很多建议,但要做好准备。 我知道的一个是cal2jd,另一个是jd2cal。 这些可以帮你确定日期。还有更多的时间和格式。文档中有一些示例。 如果你是如此倾向于C++,那么就有 它有天文计算的功能。 祝你好运 其他一些资源。。。


你可以用这个图书馆。 或者通过查看并使用这些概念获得一些见解。 我以前用过它,它非常简单。尽管有很多建议,但要做好准备。 我知道的一个是cal2jd,另一个是jd2cal。 这些可以帮你确定日期。还有更多的时间和格式。文档中有一些示例。 如果你是如此倾向于C++,那么就有 它有天文计算的功能。 祝你好运 其他一些资源。。。

通过使用从所有日历向上和从上建立转换的基础,使用基础来促进任何两个日历之间的转换。

它碰巧有一个儒略历法,还有两个公历变体{年、月、日}和{年、月、周、索引},ISO基于周的历法,以及一个不完善的伊斯兰历法。日历的添加相对容易,一旦添加,日历就可以与所有其他日历进行互操作,并且其系统时钟::时间点可以任意精度

示例代码:

#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};
}
如果您想了解有关底层算法的更多详细信息,请在此处进行讨论和验证:

通过使用从所有日历向上和从上建立转换的基础,使用基础来促进任何两个日历之间的转换。

它碰巧有一个儒略历法,还有两个公历变体{年、月、日}和{年、月、周、索引},ISO基于周的历法,以及一个不完善的伊斯兰历法。日历的添加相对容易,一旦添加,日历就可以与所有其他日历进行互操作,并且其系统时钟::时间点可以任意精度

示例代码:

#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};
}
如果您想了解有关底层算法的更多详细信息,请在此处进行讨论和验证:


库已经完成了所有这些操作。您可以使用或修改底部连接的C++代码。这是由Edward M. Reingold,Calnrordic计算的作者之一。库已经完成了所有这些。你可以使用或适应在底部连接的C++代码。这是爱德华·M·莱因戈尔德写的,他是历法计算的作者之一。