c - 纪元(以秒为单位)到 C 中的 MJD 转换

标签 c

我想将纪元格式的给定时间转换为 MJD(修改后的儒略日)。但没有得到确切的 MJD 等价物。我认为缺少一些偏移值。

#include <stdio.h>
#include <time.h>
#include <memory.h>


int get_mjd (int Y, int M, int D)
{
    int L = 0, MJD = 0;
    if ((M == 1) || (M == 2))
        L = 1;
    MJD = 14956 + D + (int)((Y - L) * 365.25) +
            (int)((M + 1 + L * 12) * 30.60001);
    return MJD;
}


int main(){
        time_t start;
        int mjd;
        struct tm start_tm;

         start = 1442286867; // Tue, 15 Sep 2015 03:14:27 GMT
         memcpy(&start_tm, localtime(&start),sizeof(struct tm));


         printf("year:%d\tmonth: %d\tday: %d\n",start_tm.tm_year,start_tm.tm_mon,start_tm.tm_mday);

        mjd = get_mjd(start_tm.tm_year,start_tm.tm_mon, start_tm.tm_mday);

        printf("mjd: %d\n",mjd);

return 0;
}

输出: 年:115 月:8 日:15 mjd: 57249

预期的mjd应该是57280

请让我知道这里可能遗漏了什么。

最佳答案

如果您不需要将日期分解为公历年/月/日值,则有一种更简单的方法。

double mjd(time_t epoch_time)
{
    return epoch_time / 86400.0 + 40587;
}

值 40587 是 MJD 纪元(1858-11-17)和 Unix 纪元(1970-01-01)之间的天数,86400 是一天中的秒数。

关于c - 纪元(以秒为单位)到 C 中的 MJD 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32577183/

相关文章:

c - 如何在单步执行断点后显示 pwndbg 或 GEF 菜单,但不再次单步执行?

c++ - 在 x + y 中获取 "carry"

c++ - 为什么没有 cdirent 或 sys/cstat

c - 如何将struct char写入文件

c - 从另一个数组填充 C 中的 char 数组

c - Valgrind:禁用条件跳转(或整个库)检查

c - 如何创建一个多维数组,其维度基于 C 中的变量?

c - 从 C 文件解析参数的最简单方法是什么?

c - 在 Cortex 中,如何将单个字节转换为字?

c - short int Integer wrap around/short int inversion in c 不理解,分配和打印之间的区别