|
|
function [gpsTime,fctSeconds] = Utc2Gps(utcTime) |
|
|
% [gpsTime,fctSeconds] = Utc2Gps(utcTime) |
|
|
% Convert the UTC date and time to GPS week & seconds |
|
|
% |
|
|
% Inputs: |
|
|
% utcTime: [mx6] matrix |
|
|
% utcTime(i,:) = [year,month,day,hours,minutes,seconds] |
|
|
% year must be specified using four digits, e.g. 1994 |
|
|
% year valid range: 1980 <= year <= 2099 |
|
|
% |
|
|
% Outputs: |
|
|
% gpsTime: [mx2] matrix [gpsWeek, gpsSeconds], |
|
|
% gpsWeek = number of weeks since GPS epoch |
|
|
% gpsSeconds = number of seconds into gpsWeek, |
|
|
% fctSeconds: full cycle time = seconds since GPS epoch (1980/01/06 00:00 UTC) |
|
|
|
|
|
% Other functions needed: JulianDay.m, LeapSeconds.m |
|
|
|
|
|
%initialize outputs |
|
|
gpsTime=[]; |
|
|
fctSeconds=[]; |
|
|
|
|
|
[bOk]=CheckUtcTimeInputs(utcTime); |
|
|
if ~bOk |
|
|
return |
|
|
end |
|
|
|
|
|
HOURSEC = 3600; MINSEC = 60; |
|
|
daysSinceEpoch = floor(JulianDay(utcTime) - GpsConstants.GPSEPOCHJD); |
|
|
|
|
|
gpsWeek = fix(daysSinceEpoch/7); |
|
|
dayofweek = rem(daysSinceEpoch,7); |
|
|
% calculate the number of seconds since Sunday at midnight: |
|
|
gpsSeconds = dayofweek*GpsConstants.DAYSEC + utcTime(:,4)*HOURSEC + ... |
|
|
utcTime(:,5)*MINSEC + utcTime(:,6); |
|
|
gpsWeek = gpsWeek + fix(gpsSeconds/GpsConstants.WEEKSEC); |
|
|
gpsSeconds = rem(gpsSeconds,GpsConstants.WEEKSEC); |
|
|
|
|
|
% now add leapseconds |
|
|
leapSecs = LeapSeconds(utcTime); |
|
|
fctSeconds = gpsWeek(:)*GpsConstants.WEEKSEC + gpsSeconds(:) + leapSecs(:); |
|
|
% when a leap second happens, utc time stands still for one second, |
|
|
% so gps seconds get further ahead, so we add leapsecs in going to gps time |
|
|
|
|
|
gpsWeek = fix(fctSeconds/GpsConstants.WEEKSEC); |
|
|
iZ = gpsWeek==0; |
|
|
gpsSeconds(iZ) = fctSeconds(iZ); %set gpsSeconds directly, because rem(x,0)=NaN |
|
|
gpsSeconds(~iZ) = rem(fctSeconds(~iZ),gpsWeek(~iZ)*GpsConstants.WEEKSEC); |
|
|
|
|
|
gpsTime=[gpsWeek,gpsSeconds]; |
|
|
assert(all(fctSeconds==gpsWeek*GpsConstants.WEEKSEC+gpsSeconds),... |
|
|
'Error in computing gpsWeek, gpsSeconds'); |
|
|
|
|
|
end %end of function Utc2Gps |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
|
|
function [bOk] = CheckUtcTimeInputs(utcTime) |
|
|
%utility function for Utc2Gps |
|
|
|
|
|
%check inputs |
|
|
if size(utcTime,2)~=6 |
|
|
error('utcTime must have 6 columns') |
|
|
end |
|
|
|
|
|
%check that year, month & day are integers |
|
|
x = utcTime(:,1:3); |
|
|
if any(any( (x-fix(x)) ~= 0 )) |
|
|
error('year,month & day must be integers') |
|
|
end |
|
|
|
|
|
%check that year is in valid range |
|
|
if ( any(utcTime(:,1)<1980) || any(utcTime(:,1)>2099) ) |
|
|
error('year must have values in the range: [1980:2099]') |
|
|
end |
|
|
|
|
|
%check validity of month, day and time |
|
|
if (any(utcTime(:,2))<1 || any(utcTime(:,2))>12 ) |
|
|
error('The month in utcTime must be a number in the set [1:12]') |
|
|
end |
|
|
if (any(utcTime(:,3)<1) || any(utcTime(:,3)>31)) |
|
|
error('The day in utcTime must be a number in the set [1:31]') |
|
|
end |
|
|
if (any(utcTime(:,4)<0) || any(utcTime(:,4)>=24)) |
|
|
error('The hour in utcTime must be in the range [0,24)') |
|
|
end |
|
|
if (any(utcTime(:,5)<0) || any(utcTime(:,5)>=60)) |
|
|
error('The minutes in utcTime must be in the range [0,60)') |
|
|
end |
|
|
if (any(utcTime(:,6)<0) || any(utcTime(:,6)>60)) |
|
|
%Note: seconds can equal 60 exactly, on the second a leap second is added |
|
|
error('The seconds in utcTime must be in the range [0,60]') |
|
|
end |
|
|
|
|
|
bOk = true; |
|
|
|
|
|
end %end of function CheckUtcTimeInputs |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
|
|
% Copyright 2016 Google Inc. |
|
|
% |
|
|
% Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
% you may not use this file except in compliance with the License. |
|
|
% You may obtain a copy of the License at |
|
|
% |
|
|
% http://www.apache.org/licenses/LICENSE-2.0 |
|
|
% |
|
|
% Unless required by applicable law or agreed to in writing, software |
|
|
% distributed under the License is distributed on an "AS IS" BASIS, |
|
|
% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
|
% See the License for the specific language governing permissions and |
|
|
% limitations under the License.
|
|
|
|