|
|
function [leapSecs] = LeapSeconds(utcTime) |
|
|
% leapSecs = LeapSeconds(utcTime) |
|
|
% find the number of leap seconds since the GPS Epoch |
|
|
% |
|
|
% 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 |
|
|
% |
|
|
% Output: leapSecs, |
|
|
% leapSecs(i) = number of leap seconds between the GPS Epoch and utcTime(i,:) |
|
|
% |
|
|
% The function looks up the number of leap seconds from a UTC time table |
|
|
% |
|
|
% LATEST LEAP SECOND IN THE TABLE = 31 Dec 2016. |
|
|
% On 1 Jan 2017: GPS-UTC=18s |
|
|
% See IERS Bulletin C, https://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat |
|
|
% and http://tycho.usno.navy.mil/leapsec.html |
|
|
% |
|
|
% Aren't Leap Seconds a pain? Yes, and very costly. Ban the Leap Second: |
|
|
% Leap seconds occur on average once every two years. |
|
|
% What would happen if we had no leap seconds: |
|
|
% 1) Thousand of engineers would NOT spend several weeks each two years fixing |
|
|
% or planning for leap second bugs. |
|
|
% 2) About seven thousand years from now, solar time would be 1 hour behind UTC |
|
|
% and we would need a 1 hour adjustment - similar to daylight savings time. |
|
|
% 3) GMT (which is solar time) will lose its significance. |
|
|
|
|
|
|
|
|
%Author: Frank van Diggelen |
|
|
%Open Source code for processing Android GNSS Measurements |
|
|
|
|
|
[m,n] = size(utcTime); |
|
|
if n~=6 |
|
|
error('utcTime input must have 6 columns'); |
|
|
end |
|
|
|
|
|
% UTC table contains UTC times (in the form of [year,month,day,hours,mins,secs]) |
|
|
% At each of these times a leap second had just occurred |
|
|
utcTable = [1982 1 1 0 0 0; |
|
|
1982 7 1 0 0 0; |
|
|
1983 7 1 0 0 0; |
|
|
1985 7 1 0 0 0; |
|
|
1988 1 1 0 0 0; |
|
|
1990 1 1 0 0 0; |
|
|
1991 1 1 0 0 0; |
|
|
1992 7 1 0 0 0; |
|
|
1993 7 1 0 0 0; |
|
|
1994 7 1 0 0 0; |
|
|
1996 1 1 0 0 0; |
|
|
1997 7 1 0 0 0; |
|
|
1999 1 1 0 0 0; |
|
|
2006 1 1 0 0 0; |
|
|
2009 1 1 0 0 0; |
|
|
2012 7 1 0 0 0; |
|
|
2015 7 1 0 0 0; |
|
|
2017 1 1 0 0 0 |
|
|
]; |
|
|
%when a new leap second is announced in IERS Bulletin C |
|
|
%update the table with the UTC time right after the new leap second |
|
|
|
|
|
tableJDays = JulianDay(utcTable) - GpsConstants.GPSEPOCHJD; %days since GPS Epoch |
|
|
%tableSeconds = tableJDays*GpsConstants.DAYSEC + utcTable(:,4:6)*[3600;60;1]; |
|
|
%NOTE: JulianDay returns a realed value number, corresponding to days and |
|
|
% fractions thereof, so we multiply it by DAYSEC to get the full time in seconds |
|
|
tableSeconds = tableJDays*GpsConstants.DAYSEC; |
|
|
jDays = JulianDay(utcTime)- GpsConstants.GPSEPOCHJD; %days since GPS Epoch |
|
|
%timeSeconds = jDays*GpsConstants.DAYSEC + utcTime(:,4:6)*[3600;60;1]; |
|
|
timeSeconds = jDays*GpsConstants.DAYSEC; |
|
|
% tableSeconds and timeSeconds now contain number of seconds since the GPS epoch |
|
|
|
|
|
leapSecs=zeros(m,1); |
|
|
for i=1:m |
|
|
%add up the number of leap seconds that have occured by timeSeconds(i) |
|
|
leapSecs(i) = sum(tableSeconds<=timeSeconds(i)); |
|
|
end |
|
|
|
|
|
end %end of function LeapSeconds |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
|
|
% 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. |
|
|
|
|
|
|