以秒为单位的历元到以C为单位的MJD转换

以秒为单位的历元到以C为单位的MJD转换,c,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 = 149

我想将给定的时间以历元格式转换为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;
}
#包括
#包括
#包括
int get_mjd(int Y,int M,int D)
{
int L=0,MJD=0;
如果((M==1)|(M==2))
L=1;
MJD=14956+D+(整数)((Y-L)*365.25)+
(int)((M+1+L*12)*30.60001);
返回MJD;
}
int main(){
时间没有开始;
int-mjd;
struct tm start_tm;
start=1442286867;//2015年9月15日星期二03:14:27 GMT
memcpy(&start_tm、localtime(&start)、sizeof(struct tm));
printf(“年:%d\t月:%d\t日:%d\n”,起始年,起始月,起始日);
mjd=获得mjd(开始tm.tm年、开始tm.tm月、开始tm.tm日);
printf(“mjd:%d\n”,mjd);
返回0;
}
输出: 年份:115个月:8天:15 mjd:57249

预计mjd应为57280


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

这是又一个错误。struct tm返回范围为0-11的月份。 在使用get_mjd()之前,我需要将+1转换为tm_mon。现在它工作了

参考:自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;
}
#定义400年的天数(365L*400+97)
#定义100年的天数(365L*100+24)
#定义Daysper4年(365*4+1)
#定义Daysper1年365
#定义每个月12
#定义400年后的月份(12*400)
#定义三月三日
#定义mjdOffset(678881/*1858年11月17日*)
静态常数短日MARCH1TOBEGININGOFMONTH[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 };
整年、整月、整日{
年+=月/月/年;
月%=月/年;
//调整月份/年度至3月…2月
而(月份<月份){
月份+=月份月份月份;//每年月份
年--;
}
int d=(年/400)*日/400年;
int y400=(int)(年份%400);
d+=(y400/100)*日/100年;
int y100=y400%100;
d+=(100/4日元)*天/年;
int y4=y100%4;
d+=y4*天/年;
d+=第[month-MonthMarch]个月的第1天目标;
d+=天;
//1858年11月17日==MJD 0
d--;
d-=mjdOffset;
返回d;
}
如果不需要将日期细分为公历年/月/日值,有一种更简单的方法

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

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

从何处获得公历到修改后的朱利安日公式?它与维基百科上的非常不同(当然,维基百科上的不是正确的)。不确定这个公式的确切来源。一个很好的简单Unix
time\t
到mjd。假设代码可以使用
difftime()
作为便携式解决方案,该解决方案自1970年以来不依赖于
time
以秒为单位。