时间转换 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); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值