格里高利历就是我们平时用的年月日的东西。
unit gpstime;
interface
uses
SysUtils,Math;
procedure GPSToGer(week: integer; seconds: Extended; var year,month,day,dayofweek,hour,minute,second: Integer);
procedure GerToGPS(year,month,day,hour,minute: Integer; seconds: Extended; var weekno: Integer; var gpstime: Extended);
implementation
//GPS时间转换为格林高历(普通的日历)
procedure GPSToGer(week: integer; seconds: Extended; var year,month,day,dayofweek,hour,minute,second: Integer);
var JD: Extended;
a: Integer;
b,c,d,e: Integer;
begin
if(week < 1024) then week := week+1024;
JD := week*7+seconds/86400+2444244.5;
a := Trunc(JD+0.5);
b := a+1537;
c := Trunc((b-122.1)/365.25);
d := Trunc(365.25*c);
e := Trunc((b-d)/30.6001);
day := Trunc( b-d-Trunc(30.6001*e)+Frac(JD+0.5) );
month := e-1-12*Trunc(e/14);
year := c-4715-Trunc((7+month)/10);
dayofweek := Trunc(JD+0.5) mod 7; //星斯几,0为一,6为周日
a := Trunc(seconds) mod 86400;
hour := a div 3600;
minute := (a mod 3600) div 60;
second := a mod 60;
end;
//格林高历(普通的日历)转换为GPS时间
procedure GerToGPS(year,month,day,hour,minute: Integer; seconds: Extended; var weekno: Integer; var gpstime: Extended);
var dayofw, dayofy, yr, ttlday, m: Integer;
const dinmth: array[0..12] of integer=(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
if (year < 1981) or (month < 1) or (month > 12) or (day < 1) or (day > 31) then weekno := 0;
if(month=1) then dayofy := day
else
begin
dayofy := 0;
for m := 1 to month - 1 do
begin
dayofy := dayofy+dinmth[m];
if(m=2) then
begin
if((year mod 4=0) and (year mod 100<>0)) or (year mod 400=0) then
dayofy := dayofy+1;
end;
end;
dayofy := dayofy+day;
end;
ttlday := 360;
for yr := 1981 to year - 1 do
begin
ttlday := ttlday+365;
if((yr mod 4=0) and (yr mod 100<>0)) or (yr mod 400=0) then
ttlday := ttlday+1;
end;
ttlday := ttlday+dayofy;
weekno := ttlday div 7;
dayofw := ttlday-7*weekno;
gpstime := (hour * 3600 + minute * 60 + seconds + dayofw * 86400);
if(weekno>1024) then weekno := weekno-1024;
end;
end.
软件截图:
