时间转换 MJD&UTC

  • UTC(Universal Time, Co-ordinated) 世界协调时

  • MJD(Modified Julian Date) 修正的儒略日期

  • 所使用的符号:

  1. MJD: 修正的儒略日期
  2. UTC: 世界协调时
  3. Y: 从1900年开始(例如:对于2003年,Y=103)
  4. M: 从1到12月
  5. D: 从1到31日
  6. WY: 从1900 年算起的星期数
  7. WN: 根据ISO 8601 规定的星期数
  8. WD: 从星期1到星期日(7)
  9. K,L,M′,W,Y′: 临时变量
  10. ×: 乘法
  11. int: 取整,忽略了余数
  12. Mod 7: 模7,被7除之后的余数(0至6)
如何从MJD中计算Y,M,D,见式(B1)、式(B2)、式(B3)、式(B4)、式(B5)。

Y′ = int[(MJD-15078.2)/365.25………………………………………………(B1)
  M′ = int{[MJD-14956.1-int(Y′′365.25)]/30.6001}……………………….(B2)
  D = MJD-14956-int(Y′′365.25)-int(M′′30.6001)……………………….(B3)
  如果M′ == 14或M′ == 15,那么K = 1;否则K = 0
  Y = Y′+K…………………………………………………………………………….(B4)
  M = M′-1-K′12………………………………………………………………………(B5)

如何根据Y,M,D计算MJD,见式(B6)

如果M == 1或者M == 2那么L = 1;否则L = 0
  MJD = 14956+D+int[(Y-L)′365.25]+int[(M+1+L′12)′30.6001]…………(B6)

如何根据MJD计算WD,见式(B7)

WD = [(MJD+2)Mod 7]+1…………………………………………………………(B7)

如何根据WY,WN,WD计算MJD,见式(B8)

MJD = 15012+WD+7′{WN+int[(WY′1461/28)+0.41]}………………………….(B8)

如何根据MJD计算WY,WN,见式(B9)、式(B10)、式(B11)

W = int[(MJD/7)-2144.64]…………………………………………………….(B9)
WY = int[(W′28/1461)-0.0079]………………………………………………(B10)
WN = W-int[(WY′1461/28)+0.41]…………………………………………….(B11)
例子: MJD = 45 218 W = 4 315
Y =(19)82 WY=(19)82
M = 9(9月) WN = 36
D = 6 WD = 1(1月)
注:以上公式适用于1900年3月1日至2100年2月28日。
注:UTC + 时区差 = 本地时间

/**********************************************************
*mytime.c *

* MJD:修正的儒略日期 *

* UTC:通用时间坐标 *

* Y:从1900年开始(例如:对于2003年,Y=103) * 

* M:从1到12月 * * D:从1到31日 *

* WY:从1900年算起的星期数 *

* WN:根据ISO 8601 规定的星期数 * 

* WD:从星期1到星期日(7) * 

*********************************************************/ 

#include"mytime.h"

int calmjd(int y,int m,int d) 
{
	int l; l=0; 
	if(m==1||m==2) 
		l=1; 
	return(14956+d+(int)(((float)y-(float)l)*365.25)+(int)(((float)m+1+l*12)*30.6001)); 
} 

int calwd(int mjd)
{ 
	return((int)((mjd+2)%7)+1);
} 

int calwy(int mjd) 
{ 
	int w; 
	w=(int)(((((float)mjd)/7)-2144.64)); 
	return((int)(((float)w*28/1461)-0.0079)); 
}

int calwn(int mjd) 
{ 
	int w,wy; 
	w=(int)(((((float)mjd)/7)-2144.64)); 
	wy=(int)(((float)w*28/1461)-0.0079); 
	return(w-(int)(((float)wy*1461/28)+0.41)); 
}

int ocalmjd(int wy,int wn,int wd) 
{ 
	return(15012+wd+7*((float)wn+(int)(((float)wy*1461/28)+0.41))); 
}

int mjdtod(int mjd)
{ 
	int y1,m1; 
	y1=(int)(((float)mjd-15078.2)/365.25); 
	m1=(int)(((float)mjd-14956.1-(int)((float)y1*365.25))/30.6001); 
	return(mjd-14956-(int)((float)y1*365.25)-(int)((float)m1*30.6001)); 
}

int mjdtom(int mjd) 
{ 
	int y1,m1,k; 
	y1=(int)(((float)mjd-15078.2)/365.25); 
	m1=(int)(((float)mjd-14956.1-(int)((float)y1*365.25))/30.6001); 
	k=0; if((y1==14)||(y1==15)) k=1; return(m1-1-k*12); 
}

int mjdtoy(int mjd) 
{ 
	int y1,m1,k; 
	y1=(int)(((float)mjd-15078.2)/365.25); 
	m1=(int)(((float)mjd-14956.1-(int)((float)y1*365.25))/30.6001);
	k=0; 
	if((y1==14)||(y1==15)) 
		k=1; 
	return(y1+k); 
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,可以使用以下函数将MJD转换UTC时间: ```matlab function utc_time = mjd2utc(mjd_time) % Convert Modified Julian Date (MJD) to UTC time % Input: MJD time, in units of days since 1858-11-17 00:00:00 UTC % Output: UTC time, in MATLAB datenum format % Reference: https://en.wikipedia.org/wiki/Julian_day#MJD % Define constants mjd_epoch = 2400000.5; % MJD epoch (JD 1858.5) sec_per_day = 86400; % Number of seconds in a day % Convert MJD to Julian Day (JD) jd_time = mjd_time + mjd_epoch; % Convert JD to UTC time utc_time = (jd_time - 2440587.5) * sec_per_day / 86400 + datenum('1970-01-01 00:00:00'); end ``` 其中,输入参数`mjd_time`表示以天为单位的自1858年11月17日00:00:00 UTC起的时间差,输出参数`utc_time`是以MATLAB datenum格式表示的UTC时间。这个函数的实现方法是先将MJD转换为JD,再将JD转换UTC时间。 以下是将UTC时间转换MJD的函数: ```matlab function mjd_time = utc2mjd(utc_time) % Convert UTC time to Modified Julian Date (MJD) % Input: UTC time, in MATLAB datenum format % Output: MJD time, in units of days since 1858-11-17 00:00:00 UTC % Reference: https://en.wikipedia.org/wiki/Julian_day#MJD % Define constants mjd_epoch = 2400000.5; % MJD epoch (JD 1858.5) sec_per_day = 86400; % Number of seconds in a day % Convert UTC time to Julian Day (JD) jd_time = (utc_time - datenum('1970-01-01 00:00:00')) * 86400 / sec_per_day + 2440587.5; % Convert JD to MJD mjd_time = jd_time - mjd_epoch; end ``` 该函数的输入参数`utc_time`是以MATLAB datenum格式表示的UTC时间,输出参数`mjd_time`是以天为单位的自1858年11月17日00:00:00 UTC起的时间差。这个函数的实现方法是先将UTC时间转换为JD,再将JD转换MJD
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值