时间转换--年积日-儒略日-GPS周一、年积日、儒略日、GPS周等简介儒略历公元前46年,罗马执政官儒略·凯撒颁布了儒略历。儒略历每年12个月,平年365天,闰年366天。除2月外,单数月份31天,偶数月份30天。2月份平年29天,闰年30天。每隔3年置一闰年。儒略历是纯太阳历,每年的平均长度是365.25天。每400年,儒略历与回归年大约相差3天,即:(365.25-365.242189)*400=3.1244凯撒为了纪念改历成功,将他出生的7月从Quintilis改成自己的名字Julius儒略日和简化儒略日在天文学有一种连续纪日的儒略日(JD),它以儒略历公元前4713年1月1日的GMT正午为第0日的开始。还有一种简化儒略日(MJD):MJD=JD-2400000.5MJD的第0日是从公历1858年11月17日的GMT零时开始的。我写完前一个句号时的MJD是53583.22260。小数部分是以UTC时间在当天逝去的秒数除以86400得到的。0.22260约为UTC时间的5:20,加上中国的时区就是13:20。年积日年积日是仅在一年中使用的连续计时法。每年的1月1日计为第1日,2月1日为第32日。平年的12月31日为第365日,闰年的12月31日为第366日。格里高利历——公历公元1582年3月1日,罗马教皇格里高利十三世颁布了格里高利历,将不能被4整除的世纪年算作平年,这就是我们现在使用的公历。在公历中,每400年有97个闰年,平均每年的长度是:(365*400+97)/400=365.2425天每400年,公历与回归年大约相差0.1244天,即:(365.2425-365.242189)*400=0.1244GPS时、GPS周、周内秒GPS周(GPSWeek)是GPS系统内部所采用的时间系统。时间零点定义的为:1980年1月5日夜晚与1980年1月6日凌晨之间0点。最大时间单位是周(一周:604800秒)。每1024周(即7168天)为一循环周期。第一个GPS周循环点为1999年8月22日0时0分0秒。即从这一刻起,周数重新从0开始算起。星期记数规则是:Sunday为0,Monday为1,以此类推,依次记作0~6,GPS周记数(GPSWeekNumber)为“GPS周星期记数”。表示方法:从1980年1月6日0时开始起算的周数加上周内时间的秒数(从每周周六/周日之夜开始起算的秒数,例如:1980年1月6日0时0分0秒的GPS周:第0周,第0秒。例如:2004年5月1日10时5分15秒的GPS周:第1268周,第554715秒,GPS周记数(GPSWeekNumber)为12686,第554715秒。三、程序实现成果(具体代码见附件)1.gps2cal将GPS周和周内秒转换到公历时间functioncal=gps2cal(gpst)%gps2cal将GPS周和周内的秒转换到公历GPS时间%cal=gps2cal(week,sec)返回的公历是1x6矩阵,6列分别为年月日时分秒%gpst:1x2矩阵,2列分别为GPS周和周内的秒%GPS从MJD44244开始mjd=44244+(gpst(1)*86400*7+gpst(2))/86400;cal=mjd2cal(mjd);2.gps2cal1由公历日期和GPS周内秒计算公历时间functioncal=gps2cal1(date,tow)%gps2cal1由公历日期和gps周内秒计算公历GPS时间%cal=gps2cal1(date,tow)返回的公历是1x6矩阵,6列分别为年月日时分秒%date:1x3矩阵,3列分别为公历年月日%tow:GPS周内秒mjd=cal2mjd(date);%GPS从MJD44244开始week=floor((mjd-44244)/7);cal=gps2cal([week,tow]);3.cal2gps将公历GPS时间转换到GPS周和周内秒functiongpst=cal2gps(cal)%cal2gps将公历GPS时间转换到GPS周和周内的秒。%gpst==cal2gps(cal)返回的gpst是1x2矩阵,2列分别为GPS周和周内秒%cal:1x6矩阵,6列分别为年月日时分秒。构造cal时可以省略末尾的0iflength(cal)6cal(6)=0;endmjd=cal2mjd(cal);%GPS从MJD44244开始elapse=mjd-44244;week=floor(elapse/7);elapse=elapse-week*7;%周内天数gpst=[weekround(elapse*86400)];4.mjd2cal将简化儒略日转换到公历时间functioncal=mjd2cal(mjd)%mjd2cal将简化儒略日转换到公历年月日时分秒。%cal=mjd2cal(mjd)返回的cal是1x6矩阵,6列分别为年月日时分秒%mjd:简化儒略日jd=mjd+2400000.5;cal=jd2cal(jd);5.cal2mjd将公历时间转换到简化儒略日functionmjd=cal2mjd(theyear,themonth,theday);%returnthejulianday(year,day)定义函数julia为转换为julian日期函数,变量y为返回的julian日期,输入变量为theyear/年,themonth/月,theday/日leapyear=rem(theyear,4);%年对4求余数ifleapyear0leap=0;%判断余数大于0,不能被4整除,则用leap标记这一年不是闰年(标记为0)elseifrem(theyear,100)==0&rem(theyear,400)~=0leap=0;%能被4整除但是不能被400整除也不是闰年,则用leap标记这一年不是闰年elseleap=1;%其他情况是闰年endend%%%%%%采用平年的日历,按1-12月分月计算julian日期ifthemonth==1juliaday=theday;endifthemonth==2juliaday=theday+31;endifthemonth==3juliaday=theday+59;endifthemonth==4juliaday=theday+90;endifthemonth==5juliaday=theday+120;endifthemonth==6juliaday=theday+151;endifthemonth==7juliaday=theday+181;endifthemonth==8juliaday=theday+212;endifthemonth==9juliaday=theday+243;endifthemonth==10juliaday=theday+273;endifthemonth==11juliaday=theday+304;endifthemonth==12juliaday=theday+334;endifleap==1ifthemonth=2%如果是闰年,当月份小于2月时,julian日期与平年相同juliaday=juliaday;endifthemonth=3juliaday=juliaday+1;%当月份大于2月时,在平年的基础上加一天endendmjd(1)=theyear;mjd(2)=juliaday;%返回的矢量y,第一个元素为年,第二个元素为Julian日6.jd2cal从儒略日计算公历时间functioncal=jd2cal(J)%从儒略日计算公历年月日时分秒%cal=jd2cal(J)%返回的cal是1x6矩阵,6列分别为年月日时分秒%%公元1582年10月4日24:00点之前使用儒略历,公元1582年10月15日00:00点之后使用公历if(J1721423.5)%公元1月1日0时BC=1;elseBC=0;end%startfromJulianMarch1,4801B.C.if(J2299160.5)%before1582.10.4.24:00isJuliancalenderj0=floor(J+0.5);dd=J+0.5-j0;else%after1582.10.15.00:00isGregoriancalender%numberofcerturyyearsthatarenotleapyearn1=floor((J-2342031.5)/36524.25/4)+1;%1700.3.1.0n2=floor((J-2378555.5)/36524.25/4)+1;%1800.3.1.0n3=floor((J-2415079.5)/36524.25/4)+1;%1900.3.1.0j0=n1+n2+n3+J+10;dd=j0+0.5-floor(j0+0.5);j0=floor(j0+0.5);endj0=j0+32083;year0=ceil(j0/365.25)-1;year=year0-4800;day=j0-floor(year0*365.25);month=floor((day-0.6)/30.6)+3;day=day-round((month-3)*30.6);ifmonth12month=month-12;year=year+1;endyear=year-BC;sec=round(dd*86400);hour=floor(sec/3600);sec=sec-hour*3600;min=floor(sec/60);sec=sec-min*60;cal=[year,month,day,hour,min,sec];7.cal2jd将公历时间转换到儒略日functionjd=cal2jd(cal)%cal2jd1将公历年月日时分秒转换到儒略日。%jd=cal2jd(cal)返回儒略日%cal:1x6矩阵,6列分别为年月日时分秒。构造cal时可以省略末尾的0%%公元1582年10月4日24:00点之前使用儒略历,公元1582年10月15日00:00点之后使用公历iflength(cal)6cal(6)=0;endyear=cal(1);month=cal(2);day=cal(3)+(cal(4)*3600+cal(5)*60+cal(6))/86400;y=year+4800;%4801B.C.isacenturyyearandalsoaleapyear.if(year0)y=y+1;%Pleasenotethatthereisnoyear0A.D.endm=month;if(m=2)%JanuaryandFebruarycomeafterDecember.m=m+12;y=y-1;ende=floor(30.6*(m+1));a=floor(y/100);%numberofcenturies%教皇格雷戈里十三世于1582年2月24日以教皇训令颁布,将1582年10月5日至14抹掉。1582年10月4日过完后第二天是10月15日if(year1582)|(year==1582&month10)|(year==1582&month==10&day15)b=-38;elseb=floor((a/4)-a);%numberofcenturyyearsthatarenotleapyearsendc=floor(365.25*y);%Juliancalendaryearsandleapyearsjd=b+c+e+day-32167.5;8.cal2wd借助MJD,由公历年月日推算星期几,按照格里高利十三世的历法改革去掉1582年10月5日至14日functionwd=cal2wd(cal)%cal2wd将公历年月日转换到星期几%wd=cal2wd(cal)返回星期几%cal:1x3矩阵,3列分别为年月日%%这个函数根据儒略日推算星期。%根据教皇格雷戈里十三世的历法改革,儒略日中没有1582年10月5日至14日。%1582年10月4日过完后第二天是1