首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hijri枣公式

Hijri枣公式
EN

Stack Overflow用户
提问于 2018-05-02 08:24:51
回答 1查看 249关注 0票数 2

将诸如1525249213这样的“时间自纪元”邮票转换为Hijri日期(年月日)的公式是什么?

我知道总有一天是不准确的,这对我来说是可以的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-30 10:24:54

我发现的算法是将日期转换为朱利安日期,然后将朱利安日期转换为Hijri。

我不记得在哪里找到的。我不对使用此代码的任何错误、错误或后果负责.

代码语言:javascript
复制
unsigned long gregorian_to_julian(const int gyear, const int gmonth, const int gday) {
    if (gmonth < 3) {
        gyear -= 1;
        gmonth += 12;
    }
    auto a = int(gyear / 100.0f);
    auto b = (gyear == 1582 && (gmonth > 10 || (gmonth == 10 && gday > 4)) ? -10 :
              (gyear == 1582 && gmonth == 10 ? 0 :
               (gyear < 1583 ? 0 : 2 - a + int(a / 4.0f))));
    return int(365.25f * (gyear + 4716)) + int(30.6001f * (gmonth + 1)) + gday + b - 1524;
}

std::array<int,3> julian_to_hijri(const unsigned long julian_datestamp) {
    std::array<int,3> result;
    auto y = 10631.0f / 30.0f;
    auto epoch_astro = 1948084;
    auto shift1 = 8.01f / 60.0f;
    auto z = julian_day - epoch_astro;
    auto cyc = int(z / 10631.0f);
    z = z - 10631 * cyc;
    auto j = int((z - shift1) / y);
    z = z - int(j * y + shift1);
    result[0] = 30 * cyc + j; //Hijri Year
    result[1]= int((z + 28.5001f) / 29.5f); //Hijri Month
    if (result[1] == 13) {
        result[1]= 12;
    }
    result[2] = z - int(29.5001f * result[1]- 29);// Hijri day
    return result;
}

在结果Hijri日期中会出现+-1的错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50130137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档