文章目录

  • Part.I Introduction
    • Chap.I 基础知识
    • Chap.II 函数总览
  • Part.II Python 版代码实现
  • Part.III Matlab 版代码实现

Part.I Introduction

Chap.I 基础知识

我们常用的表示时间的方式是北京时『时分秒』,即hh:mm:ss;而且北京市并不是UTC,它和UTC存在这样的转换关系:UTC+8小时=北京时

  • 判断闰年:年份是 4 的倍数但不是 100 的倍数或者年份是 400 的倍数。
  • GPS 周:GPS Week,GPSW GPS系统内部描述时间的一种方式,它的起点为 1980 年 1 月 5 日夜晚与 1980 年 1 月 6 日凌晨之间 0 点(这天是周日,老外经常周日表示一周的第一天,以0表示)。
  • 儒列日:Julian Day,JD 是指由公元前 4713 年 1 月 1 日,协调世界时中午 12 时开始所经过的天数。
  • 简化儒列日:Modified Julian Day,MJD 后来经国际天文学联合会(1973 年)商讨,采用简化儒列日,其起点是 1858 年 11 月 17 日世界时 0 时;MJD = JD - 2400000.5
  • 年积日:Day Of Year,DOY 一年当中的第几天,其取值范围为[1,365]
  • 天内秒:Second Of Day,SOD 一天中的第几秒,其取值范围为[1,86400]
  • 周内秒:Second Of Week,SOW 一周中的第几秒,其取值范围为[1,604800]
  • 周内分:Hour Of Week,HOW 一周中的第几小时,其取值范围为[1,168]
  • 协调世界时(Universal Time of Coordination,UTC):以原子秒长为计量单位,在时刻上与平太阳时之差小于 0.9 秒的时间系统。UT0 是完全按照天体运行计算出来的时间,UT1 是在 UT0 的基础上做了一些调整,UT2 是在 UT0 和 UT1 的基础上又进行了一些调整。天体运动并不是十分稳定的,比如极移和章动的存在。
  • 国际原子时(International Atomic Time,TAI):取 1958 年 1 月 1 日 0 时 0 分 0 秒世界时(UT)的瞬间作为同年同月同日 0 时 0 分 0 秒TAI。
  • GPS 时(GPS Time,GPST):由 GPS 星载原子钟和地面监控站原子钟组成的一种原子时基准,与国际原子时保持有 19s 的常数差,并在 GPS 标准历元 1980 年 1 月 6 日 0 时与 UTC 保持一致。
  • 北斗时(BDS Time,BDT) :同 GPST 一样由原子钟保持基准,在 2006 年 1 月 1 日 0 时与 UTC 保持一致。因为从 1980 年到 2006 年共有 14 次跳秒发生,所以 BDT 和 GPST 相差 14 秒且基本恒定不变。
  • GLONASS 时(GLONASS Time,GLST):以莫斯科本地协调时 UCTsu 定义,其值与 UTC 存在 3 小时时差。
  • Galileo 时(Galileo Time,GST):同 GPST 保持一致。
  • 跳秒:leap second,在 1980 年 1 月 6 日 0 时 GPS 时与 UTC 时对齐,GPS 时是依靠稳定的原子钟来维持的,也就是说它的单位时间长度是很稳定的;而协调世界时是根据天文确定的,和地球自转有关,但是地球自转速度在不断变慢,也就是说协调世界时的单位时间长度并不是恒定的。但是总不能他们稍微不一致就调吧,这样也太麻烦了,所以就规定,当两者相差接近1秒时,就让UTC跳一秒。
  • 跳秒对是 UCT 的操作,原子时并不会跳秒。并且跳秒通常是把 UTC 『拨快』一秒(因为地球自转速度越来越慢),比如23:59:58下一秒是下一天的00:00:00,它不经过23:59:59;但不排除将其『拨慢』一秒的可能。
  • 为什么TAI - GPST = 19?这是因为国际原子时是在 1958 年与 UTC 对齐的,而 GPS 时是在 1980 年与 UTC 对齐的,从 1958 年到 1980 年已经跳了19秒。它们两个的单位时间长度都是靠原子钟维持的,只不过TAI靠的是全球分布的约 240 台原子钟维持的,而 GPS 时是靠数十台原子钟来维持的;但是原子钟的精度本身就很高了,所以它们两个的差值可以说是恒定的。

更多的关于时间系统的介绍可参看博文。

Chap.II 函数总览

下面是涉及的函数总览图。

需要注意的有一下几点:

  • 目前关于UTC的跳秒,下面编写的函数并没有考虑到

Part.II Python 版代码实现

编写不易,积分多的可给点积分。

import math
import timemonthdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]def leapyear(year):""" Determine if a year is a leap year """if year % 4 == 0 and year % 100 != 0:return 1if year % 400 == 0:return 1return 0def norm_doy(year, doy):""" Determine if a doy is legal """while True:if doy <= 0:year -= 1doy += (365 + leapyear(year))elif doy > 365 + leapyear(year):doy -= (365 + leapyear(year))year += 1else:breakreturn year, doydef doy2ymd(year, doy):""" Change year,day of year to year,month,day """day = doymon = 0for i in range(13):monthday = monthdays[i]if i == 2 and leapyear(year) == 1:monthday += 1if day > monthday:day -= monthdayelse:mon = ibreakreturn mon, daydef ymd2doy(year, mon, day):""" Change year,month,day to year,day of year """doy = dayfor i in range(1, mon):doy += monthdays[i]if mon > 2:doy += leapyear(year)return doydef ymd2mjd(year, mon, day):""" Change year,month,day to Modified Julian Day """mjd = 0.0if mon <= 2:mon += 12year -= 1mjd = 365.25 * year - 365.25 * year % 1.0 - 679006.0mjd += math.floor(30.6001 * (mon + 1)) + 2.0 - math.floor(year / 100.0) + math.floor(year / 400) + dayreturn mjddef doy2mjd(year, doy):""" Change year, day of year to Modified Julian Day """mon, day = doy2ymd(year, doy)return ymd2mjd(year, mon, day)def doys2gpsweeks(doys):''' str_yyyyddd > str_wwwwd '''year = int(doys[:4])doy = int(doys[4:])(mon, day) = doy2ymd(year, doy)(week, wday) = ymd2gpsweek(year, mon, day)return str(week) + str(wday)def ymd2gpsweek(year, mon, day):""" Change year,month,day to GPS weeks """mjd = ymd2mjd(year, mon, day)week = int((mjd - 44244.0) / 7.0)day = math.floor(mjd - 44244.0 - week * 7.0)return week, daydef mjd2gpsweek(mjd):""" Change Modified Julian Day to GPS weeks """week = int((mjd - 44244.0) / 7.0)day = math.floor(mjd - 44244.0 - week * 7.0)return week, daydef mjdsod2sow(mjd,sod):week, day = mjd2gpsweek(mjd)return day*24*3600+soddef gpsweek2mjd(week, day):""" Change GPS weeks to Modified Julian Day """return week * 7 + day + 44244def gpsweek2doy(week, day):""" Change GPS weeks to doy, year """mjd = gpsweek2mjd(week, day)return mjd2ydoy(mjd)def gpsweek2ymd(week, day):""" Change GPS weeks to year,month,day """doy, year = gpsweek2doy(week, day)mon, day = doy2ymd(year, doy)return year, mon, daydef mjd2ydoy(mjd):""" Change Modified Julian Day to year, day of year(1952+) """""" The input date must after 1952.0 """year = 1952dd = mjd + 1 - 34012yday = 366while dd > yday:dd -= ydayyear += 1if leapyear(year) == 0:yday = 365else:yday = 366return int(dd), int(year)def mjd2ymd(mjd):""" Change year-mon-day to Modified Julian Day. """doy, year = mjd2ydoy(mjd)mon, day = doy2ymd(year, doy)return year, mon, daydef sod2hms(sod):""" Change seconds of day to hours, minutes and seconds """sod = float(sod)hh = math.floor(sod / 3600)mm = math.floor((sod - hh * 3600) / 60.0)ss = int(sod - hh * 3600 - mm * 60)return hh, mm, ssdef hms2sod(hh, mm=0, ss=0.0):""" Change hours:minutes:seconds to seconds of day """return int(hh) * 3600 + int(mm) * 60 + float(ss)def sod2how(mjd, sod):""" Change (Modified Julian Day, seconds fo day) to (GPS week, hours of week) """""" not consider second slip now """doy, year = mjd2ydoy(mjd)mon, day = doy2ymd(year, doy)week, day = ymd2gpsweek(year, mon, day)return week, (sod + day * 86400) / 3600.0def sod2sow(mjd, sod):""" Change (Modified Julian Day, seconds fo day) to (GPS week, seconds of week) """""" not consider second slip now """doy, year = mjd2ydoy(mjd)mon, day = doy2ymd(year, doy)week, day = ymd2gpsweek(year, mon, day)return week, sod + day * 86400def sow2hms(sow):""" Change seconds of week to (day of week, hours, minutes and seconds) """""" not consider second slip now """sod = sow % (24*3600)dow = math.floor(sow/(24*3600)) + 1return dow, sod2hms(sod)def sow2sod(sow):""" convert Second of Week to Second of Day """return sow % (24*3600)

Part.III Matlab 版代码实现

编写不易,积分多的可给点积分。

% Determine if a year is a leap year
function whe=leapyear(year)
whe = 0;
if rem(year,4) == 0 && rem(year,100) ~= 0whe = 1;
end
if rem(year,400) == 0whe = 1;
end
end% convert an illegal doy to a normal doy
function [year,doy]=norm_doy(year,doy)
while(1)if doy <= 0year = year - 1;doy = doy + 365 + leapyear(year);elseif doy >= 365 + leapyear(year)doy = doy - (365 - leapyear(year));year = year + 1;elsebreak;end
end
end% Change year, day of year to year, month, day
function [year,mon,day]=doy2ymd(year, doy)
day = doy;
mon = 0;
monthdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
for i=1:13monthday = monthdays(i);if i==3 && leapyear(year) == 1monthday = monthday + 1;endif day > monthdayday = day - monthday;elsemon = i - 1;breakend
end
end% Change year, month, day to year, day of year
function [year,doy]=ymd2doy(year, mon, day)
doy=day;
monthdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
for i=1:mondoy=doy+monthdays(i);
end
if mon>2doy=doy+leapyear(year);
end
end% Change year, month, day to Modified Julian Day
function mjd=ymd2mjd(year, mon, day)
if mon <= 2mon = mon + 12;year = year - 1;
end
mjd = 365.25 * year - rem(365.25 * year , 1.0) - 679006.0;
mjd = mjd + floor(30.6001 * (mon + 1)) + 2.0 - ...floor(year / 100.0) + floor(year / 400) + day;
end% Change year, day of year to Modified Julian Day
function mjd=doy2mjd(year, doy)
[year,doy] = norm_doy(year, doy);
[year, mon, day] = doy2ymd(year, doy);
mjd=ymd2mjd(year, mon, day);
end% Change year,month,day to GPS weeks
function [week,day]=ymd2gpsweek(year, mon, day)
mjd = ymd2mjd(year, mon, day);
week = floor((mjd - 44244.0) / 7.0);
day = floor(mjd - 44244.0 - week * 7.0);
end% Change Modified Julian Day to year, day of year
% The input date must after 1952.0
function [year,doy]=mjd2ydoy(mjd)
year = 1952;
dd = mjd + 1 - 34012;
yday = 366;
while(dd > yday)dd = dd - yday;year = year + 1;yday = 365 + leapyear(year);
end
year = floor(year);
doy = floor(dd);
end% Change seconds of day to hours, minutes and seconds
function [hh,mm,ss]=sod2hms(sod)
hh = floor(sod/3600);
mm = floor((sod-hh*3600)/60);
ss = floor(sod - hh * 3600 - mm * 60);
end% Change hours:minutes:seconds to seconds of day
function sod = hms2sod(hh, mm, ss)
sod = floor(hh)*3600 + floor(mm)*60 + ss;
end% Change (Modified Julian Day, seconds fo day) to (GPS week, hours of week)
function [week, how]=sod2how(mjd,sod)
[year,doy]=mjd2ydoy(mjd);
[year,mon,day]=doy2ymd(year, doy);
[week,day]=ymd2gpsweek(year, mon, day);
how=(sod+day*86400)/3600.0;
end

GNSS 时间系统的转换代码实现(Matlab/Python)相关推荐

  1. GPS时间系统的转换

    GPS所采用的是原子时秒长,起点为1980年1月6日的UTC0时. 在GPS应用中,时常需要采用GPS时间,格式为GPS周+GPS周内秒,从RINEX格式文件中读取的时间均为 格里高利时,所以需要进行 ...

  2. TDMS数据 读取/转换/保存 为MATLAB/Python 可读取的通用数据格式的的方法

    TDMS格式是NI主推的高速测试测量采集系统中的一种二进制数据存储类型,适合存储海量才几级数据,兼有高速.方便和易存取等多种优点.做过实际测量项目的筒子们在NI的相关平台例如:CompactRIO/L ...

  3. python数字大小写转换代码_用python实现把数字人民币金额转换成大写的脚本程序...

    # -*- coding: utf-8 -*- def Num2MoneyFormat( change_number ): """ .转换数字为大写货币格式( forma ...

  4. python温度转换代码_用python编写一个名为“convert_temp”的温度转换函数

    编写一个名为"convert_temp"的温度转换函数.它应该能够处理华氏到摄氏的转换以及摄氏到华氏的转换. 它必须接受并读取传递给它的两个参数:第一,原始温度的温标(只应使用&q ...

  5. python米和厘米转换代码_用Python写一个朴素的长度单位转换器

    一直想写个简单的GUI练习一下,于是参考(tkinter模块. 预期效果: image.png Python3代码: # UnitsExchange1.0 from tkinter import * ...

  6. 数学类网站、代码(Matlab Python R)、编程站点

    B 站 纪录片: 古典音乐欣赏: 0. math & code COME ON CODE ON | A blog about programming and more programming. ...

  7. GNSS时间时区转换

    GNSS时间时区转换 代码说明 代码 讨论 代码说明 一般情况下,从惯导设备或者卫星定位获取的时间都是以英国格林尼治时间为准的,即时区为0.而我们使用的时间一般是北京时间,即东八区的时间.所以要对GN ...

  8. C#编程练习(03):北斗时间系统、GPS时间系统及其与UTC时间系统之间的转换

    需求说明:北斗周-周内秒转化为日历时,转化为UTC时,转化为GPS周周内秒 GPS周-周内秒转化为日历时,转化为UTC时,转化为北斗周-周内秒 设计示意图: 源代码: using System; us ...

  9. 卫星导航定位 -- 坐标系统与时间系统

    原文https://blog.csdn.net/f2157120/article/details/81210843 1 协议天球坐标系 以地球质心为坐标原点,以地球自转的轴为z轴 2 协议地球坐标系 ...

最新文章

  1. sys.check_constraints
  2. ipmi重启_重启ipmi服务器
  3. 实现图书增删的代码_不仅仅是图书信息管理系统
  4. java netty swap高_Netty 超时机制及心跳程序实现
  5. Oracle 动态视图3 V$SESSION
  6. python-opencv 图像二值化,自适应阈值处理
  7. OFFICE工具条的改进
  8. iPhone iPad游戏应用开发视频教程
  9. 图像加密算法毕业论文【含代码】
  10. 华为首款鸿蒙平板发布,华为MatePad Pro发布亮相!华为首款鸿蒙平板全新体验!...
  11. 未转变者入侵服务器后台,未转变者(unturned)联机服务器创建方法
  12. 教你如何用ps制作紫色光斑效果
  13. 家庭風水的六大注意事項_家居风水自查
  14. ASWEET项目实施日志
  15. 重磅发布!GitHub App 正式上架
  16. Linux内核源码介绍
  17. 项立刚:小米手环就是屌丝的身份牌
  18. Ideas Of MySelf 20005-07-26
  19. Oracle之Check约束实例详解
  20. 网络版收银系统服务器更新是什么意思,POS收银系统也需要更新的五大理由

热门文章

  1. 陕西师范大学计算机类专业咋样,陕西师范大学计算机类专业2016年在陕西理科高考录取最低分数线...
  2. url获取网站信息不包含网页源文件内的标签_超详细的网站内部seo优化教程
  3. 微型计算机中 其CPU又称______,微机原理综合练习题3答案
  4. Python正则表达式匹配C语言函数
  5. 看板管理方法在软件项目中的意义,以及与Scrum方法的区别
  6. 开关电源和LDO纹波
  7. 使用plt库绘制图标
  8. 使用插件实现vuex数据持久化
  9. 物联网世界:得标准者得天下
  10. java filenamefilter_「创作开运礼」Java之FileNameFilter过滤器的使用