时间转换 MJD&UTC
-
UTC(Universal Time, Co-ordinated) 世界协调时
-
MJD(Modified Julian Date) 修正的儒略日期
-
所使用的符号:
- MJD: 修正的儒略日期
- UTC: 世界协调时
- Y: 从1900年开始(例如:对于2003年,Y=103)
- M: 从1到12月
- D: 从1到31日
- WY: 从1900 年算起的星期数
- WN: 根据ISO 8601 规定的星期数
- WD: 从星期1到星期日(7)
- K,L,M′,W,Y′: 临时变量
- ×: 乘法
- int: 取整,忽略了余数
- 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);
}
上一篇: Linux内核中的延时函数详解