手上一个项目要用到,查了些资料,写出了其计算算法的代码,记录于此。
C++版:
#include <stdio.h>
#include <math.h>
int dinmth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int GetGPSTime(int year,int month,int day,int hour,int minute,double second,double *gpstime)
{
int dayofw,dayofy, yr, ttlday, m, weekno;
/* 检查时间是否超限*/
if (year < 1981 || month < 1 || month > 12 || day < 1 || day > 31)
weekno = 0;
/* 计算为今年中的哪一天 */
if (month == 1)
dayofy = day;
else
{
dayofy = 0;
for (m=1; m<=(month-1); m++)
{
dayofy += dinmth[m];
if ( m==2 )
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
dayofy += 1;
}
}
dayofy += day;
}
/* 计算GPS周与GPS秒 */
ttlday = 360;
for (yr=1981; yr<=(year-1); yr++)
{
ttlday += 365;
if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 ==0)
ttlday += 1;
}
ttlday += dayofy;
weekno = ttlday/7;
dayofw = ttlday - 7 * weekno;
*gpstime = (hour * 3600 + minute * 60 + second + dayofw * 86400);
if(weekno>1024){weekno-=1024;}
return weekno;
}
void main() //主函数
{
int weekno;
double gpstime;
weekno=GetGPSTime(2009, 12, 2, 19, 44, 30, &gpstime);
printf("%d %f",weekno,gpstime);
scanf("%d",&weekno);
}
C#版:
/// <summary>
/// 将日期和时间转换为GPS时
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
/// <param name="day"></param>
/// <param name="hour"></param>
/// <param name="minute"></param>
/// <param name="second"></param>
/// <param name="gpstime"></param>
/// <param name="weekno"></param>
public void GetGPSTime(int year, int month, int day, int hour, int minute, double second, ref double gpstime, ref int weekno)
{
int dayofw, dayofy, yr, ttlday, m;
if (year < 1981 || month < 1 || month > 12 || day < 1 || day > 31)
{
weekno = 0;
}
if (month == 1)
{
dayofy = day;
}
else
{
dayofy = 0;
for (m = 1; m <= (month - 1); m++)
{
dayofy += dinmth[m];
if (m == 2)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
dayofy += 1;
}
}
dayofy += day;
}
ttlday = 360;
for (yr = 1981; yr <= (year - 1); yr++)
{
ttlday += 365;
if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0)
ttlday += 1;
}
ttlday += dayofy;
weekno = ttlday / 7;
dayofw = ttlday - 7 * weekno;
gpstime = (hour * 3600 + minute * 60 + second + dayofw * 86400);
if (weekno > 1024)
{
weekno -= 1024;
}
}
用法:
public partial class Form1 : Form
{
YUMA yuma = new YUMA();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
DateTime currentTime = new DateTime();
currentTime = DateTime.Now;
int weekno=0;
double gpstime=0;
yuma.GetGPSTime(currentTime.Year, currentTime.Month, currentTime.Day, currentTime.Hour, currentTime.Minute, currentTime.Second, ref gpstime, ref weekno);
MessageBox.Show(weekno.ToString() + " " + gpstime.ToString());
}
}