以秒为单位的历元到以C为单位的MJD转换
我想将给定的时间以历元格式转换为MJD(修改的朱利安日)。但是没有得到精确的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
#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
以秒为单位。