在C

时间:2015-09-15 03:24:04

标签: 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

请告诉我这里可能缺少什么。

3 个答案:

答案 0 :(得分:2)

如果您不需要分解为公历年/月/日值的日期,那么可以采用更简单的方式。

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

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

答案 1 :(得分:1)

参考Modified Julian Day:自1858年11月17日以来的几天

get_mjd()奇怪地引用Y作为1900年的年份,但M在传统的1 = 1月,2 = 2月等等。

get_mjd()在1898年至2099年间工作多年,但在此之外失败。

// For years from 1900, limited range
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;
}

以下适用于更大的范围或公历 M,D不限于它们的通常范围,不需要浮点数学。

#define DaysPer400Years   (365L*400 + 97)
#define DaysPer100Years   (365L*100 + 24)
#define DaysPer4Years     (365*4    +  1)
#define DaysPer1Year      365
#define MonthsPerYear     12
#define MonthsPer400Years (12*400)
#define MonthMarch        3
#define mjdOffset         (678881  /* Epoch Nov 17, 1858 */)

static const short DaysMarch1ToBeginingOfMonth[12] = { 
    0, 
    31, 
    31 + 30, 
    31 + 30 + 31, 
    31 + 30 + 31 + 30, 
    31 + 30 + 31 + 30 + 31, 
    31 + 30 + 31 + 30 + 31 + 31,
    31 + 30 + 31 + 30 + 31 + 31 + 30,
    31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
    31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30, 
    31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31,
    31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31 };

int ymd_to_mjd_x(int year, int month, int day) {
  year += month / MonthsPerYear;
  month %= MonthsPerYear;
  // Adjust for month/year to Mar... Feb
  while (month < MonthMarch) {
    month += MonthsPerYear; // Months per year
    year--;
  }
  int d = (year / 400) * DaysPer400Years;
  int y400 = (int) (year % 400);
  d += (y400 / 100) * DaysPer100Years;
  int y100 = y400 % 100;
  d += (y100 / 4) * DaysPer4Years;
  int y4 = y100 % 4;
  d += y4 * DaysPer1Year;
  d += DaysMarch1ToBeginingOfMonth[month - MonthMarch];
  d += day;
  // November 17, 1858 == MJD 0
  d--;
  d -= mjdOffset;
  return d;
}

答案 2 :(得分:0)

这又是一次错误。 struct tm返回范围为0-11的月份。 在使用get_mjd()之前,我需要+1到tm_mon。现在它有效!