GNSS时间转换

算法部分

GitHub完整源程序地址

https://github.com/brucema49/GNSStime_conversion.git

代码部分:

#include <iostream>
#include<string>
#include <iomanip>
#include<math.h>
#include<stdio.h> 
using namespace std;
// 格里高利日期转换为儒略日 
double def1(double a[6])
{double s1,s2,s3,jd;
    s1=(int ) (1461*(a[0]+4800+(int) ((a[1]-14)/12 ))/4 );
    s2= (int) (367*(a[1]-2-(int) ((a[1]-14)/12 )*12)/12 );
    s3=(int) (3*(int)((a[0]+4900+(int) ((a[1]-14)/12) )/100 )/4 );
    jd= a[2]-32075+s1+s2-s3-0.5+a[3]/24+a[4]/1440+a[5]/86400;
     return jd; 
           }
//儒略日转换为格里高利日期 
double *def2(double jd)
{
    
    double  j,n,l1,l2,l3,y1,m1,t,t1;
//定义静态变量,防止返回地址在函数结束时被销毁 
static    double a[6]; 

    j=(int) (jd+0.5 ),n=(int) (4*(j+68569)/146097);
     l1=j+68569-(int) ((n*146097+3)/4 ), y1=(int) ((4000*(l1+1)/1461001) );
    l2=l1-(int) ((1461*y1/4))+31,m1=(int) (80*l2/2447 );
    a[2]=l2-(int) (2447*m1/80 ),l3= (int) (m1/11 );
    a[1]=m1+2-12*l3,a[0]=(int) (100*(n-49)+y1+l3 );
    t=fmod(((jd+0.5-(int) jd )*24),24 ); 
    a[3]=(int) t;
    t1=fmod((t-a[3])*60,60),a[4]=(int) t1,a[5]=fmod((t1-a[1])*60,60 );
    
     return a;
}
//年+年积日+天内秒转换为儒略日 
void  def3(double a[3])
{
    double jd1,jd2,jd,b[6];
b[0]=a[0],b[1]=1,b[2]=1,b[3]=b[4]=b[5]=0;
    jd1=def1(b);
    jd2=a[1]+jd1-1,jd=jd2+a[2]/86400;
    printf("儒略日为 %lf",jd);
    
}
//儒略日转换为年+年积日+天内秒 
void  def4(double jd)
{
    double *a,b[6],c1;
    a=def2(jd);
    b[0]=a[0],b[1]=b[2]=1,b[3]=b[4]=b[5]=0;
    c1=def1(b),a[1]=jd-c1+1,a[2]=a[3]*3600+a[4]*60+a[5];
    cout<<a[0]<<"年 "<<a[1]<<"年积日 "<<a[2]<<" 天内秒"; 
}

//GPS周+周内秒转换为儒略日 
void def5()
{
    cout<<"请输入GPS周+周内秒";
     double a[2],jd;
     cin>>a[0]>>a[1];
     jd=2444244.5+a[0]*7+a[1]/86400;
     printf("儒略日为%lf",jd);
}
//儒略日转换为GPS周+周内秒 
void  def6()
{
    double m,jd;
    cout<<"请输入儒略日"<<endl;
     cin>>jd;
     int z;
     z=(int) ((jd-2444244.5)/7);
     m=( (jd-2444244.5)/7-z)*604800;
     cout<<z<<"周"<<m<<"周内秒"; 
}
/*根据BD周+周内秒得到的儒略日具有如下约束条件:jd对应的儒略日大于(1980,1,6,0,0,0.0)对应的儒略日,即jd≥2444244.5。
//BD周+周内秒转为儒略日 */
void  def7()
{
    cout<<"请输入BD周+周内秒";
    double a[2],jd;
    cin>>a[0]>>a[1];
    jd=2453736.5+a[0]*7+a[1]/86400; 
    printf("儒略日为%lf",jd);
}

//儒略日转为BD周+周内秒 
void  def8()
{
    cout<<"请输入儒略日"<<endl;
    double jd,m;
    int z;
    cin>>jd;
z=int((jd-2453736.5)/7);
m=((jd-2453736.5)/7-z)*604800;    
cout<<z<<"BD周"<<m<<"周内秒";
}

//儒略日转换为Galileo周+周内秒 
void  def9()
{
    cout<<"请输入Galileo周+周内秒";
    double a[2],jd;
    cin>>a[0]>>a[1];
    jd=2451412.5+a[0]*7+a[1]/86400;
    printf("儒略日为%lf",jd);
}
//儒略日转换为Galileo周+周内秒 
void  def10()
{cout<<"请输入儒略日";
double jd,m;
int z;
cin>>jd;
z= ((jd-2451412.5)/7);
m=( (jd-2451412.50 )/7-z)*604800;
printf("%dGalileo周+%lf周内秒",z,m); 
}
/* 
Galileo周+周内秒时间标示法具有如下约束条件
周:z≥0.
周内秒(Time of Week):0≤m<604800
根据GPS周+周内秒得到的儒略日具有如下约束条件:jd对应的儒略日大于(1999,8,22,0,0,0.0)对应的儒略日,即jd≥2451412.5
*/

//glonasst计时转换为儒略日
void  def11()
{
    cout<<"请输入glonasst计时N4+Nt+h+m+s\n";
    double Nt,N4,a[6],Jdn,jd,h,m,s;
    cin>>N4>>Nt>>h>>m>>s;
    a[0]=1996+4*(N4-1),a[1]=a[2]=1,a[3]=a[4]=a[5]=0;
     Jdn=def1(a);
     jd=Nt-1+Jdn+h/24+m/1440+s/86400;
     printf("儒略日为%lf",jd);
}
//儒略日转换为glonasst 
void  def12()
{
    cout<<"请输入儒略日";
    double jd,*a,b[6],JDn,Nt,c;
    int h,m,s; 
    int N4;
    cin>>jd;
    a=def2(jd);
    N4=(int) ((a[0]-1996)/4)+1;
    b[0]=1996+4*(N4-1),b[1]=b[2]=1,b[3]=b[4]=b[5]=0;
    JDn=def1(b);
    Nt=jd-JDn+1;c=Nt-(int) Nt;Nt=(int) Nt;
    h=(int)(c*24);m=(int)((c*24-h)*60);s=((c*24-h)*60-m)*60;
    cout<<"GLONASST计时为"<<"N4:"<<N4<<" Nt:"<<Nt<<" 时:"<<h<<" 分:"<<m<<" 秒:"<<s;
}


int main()
{
cout<<"格里高利历日期转换为儒略日请输入1        "<<"儒略日转换成格里高利日期请输入2"<<endl;
cout<<"年+年积日+天内秒转换为儒略日请输入3      "<<"儒略日转换为年+年积日+天内秒请输入4"<<endl; 
cout<<"GPS周+周内秒转为儒略日请输入5            "<<"儒略日转换到GPS周+周内秒请输入6"<<endl;
cout<<"BD周+周内秒转为儒略日请输入7             "<<"儒略日转换到BD周+周内秒请输入8"<<endl;
cout<<"Galileo周+周内秒转为儒略日请输入9        "<<"儒略日转换到Galileo周+周内秒请输入 10"<<endl;
cout<<"GLONASST计时转换到儒略日请输入11         "<<"儒略日转换到GLONASST计时请输入12"<<endl<<"请输入选项(数字)";

int i;
cin>>i;
  switch(i)
{ case 1:
    int i;
    cout<<"请输入格里高利日期年+月+日+时+分+秒";
    double a[6],jd1;
         for(i=0;i<6;i++){
         cin>>a[i];
     }
jd1=def1(a);
printf("儒略日日期为%lf",jd1);
  break;
  
  case 2:
      double jd;
      double *p;
          cout<<"请输入儒略日 ";
    cin>>jd;
    p= def2(jd);
cout<<"格里高利日期为"<< (int) p[0]<<"year"<<(int) p[1]<<"month"<<(int) p[2]<<"day"<<(int) p[3]<<"hour"<<(int) p[4]<<"minute"<<(int) p[5]<<"second";
     break;
     
  case 3:
          int j;
          double b[3];
    cout<<"请输入年+年积日+天内秒  "<<endl;
    for(j=0;j<3;j++)  cin>>b[j];
    def3(b);
    break;
    
  case 4:
      double jd2;
      cout<<"请输入儒略日  "<<endl;
    cin>>jd2;
    def4(jd2);
    break;
    
  case 5:
    def5();
    break;
      
  case 6:
    def6();
    break;
  case 7:
    def7();         
    break;    
  case 8:
    def8();
    break;
  case 9:
    def9();
    break;
  case 10:
    def10();
    break;
    
  case 11:
    def11();
  break;
  case 12 :
    def12();
    break;            
}
    return 0;
}

禁止一切商业转载,网络非商业转载请注明出处

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值