c++ - 将公历日期转换为儒略日期,然后再返回(带时间)

标签 c++ date gregorian-calendar date-conversion

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

现在我有从公历日期到儒略日期的转换,所以从逻辑上讲,我觉得我应该能够以某种方式简单地反转等式,而且这会相当简单。但是,我正在执行一个两步过程,首先将公历日期转换为儒略日期,然后再转换为儒略日期(不同之处在于日期不包括时间)。所以将它转换回来应该只是意味着我必须从等式中取回小时、分钟和秒,然后将儒略日数字单独转换回公历日期。我想这是对小时、分钟和秒进行 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);

下半部分是计算小时、分钟和秒后所需的计算。他们所做的就是将儒略日编号恢复为公历日期。

维基页面为那些不熟悉的人解释了整个朱利安日期:http://en.wikipedia.org/wiki/Julian_day

我希望我已经充分解释了我的需要!感谢你们提供的任何帮助!

最佳答案

free, open source C++11/14 date/time library使用 <chrono>通过设置从所有日历到Unix Time的转换来促进任何两个日历之间转换的基础.

它恰好有一个儒略历以及公历的两个变体({年,月,日}和{年,月,星期日,索引}),基于 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

关于c++ - 将公历日期转换为儒略日期,然后再返回(带时间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12864741/

相关文章:

c++ - CMake 的默认构建目标的名称是什么?

c++ - 调用函数并使用结果调用另一个函数的有效方法

c++ - 修改排列算法以防止重复打印输出的策略

date - 如何在SAS中将日期格式d.m.yyyy转换为dd.mm.yyyy?

javascript - 使用 JavaScript 替换字符串中的日期

java - 获取特殊日期 Java 的(星期几)?

c++ - 允许用户输入空格?

java - jooq 为 Oracle 返回没有时间的日期

Java 1.5 Calendar#compareTo() 混淆

java - 如何将 dateTime 类型转换为 gregorianCalendar