Files
astro/doc/manual/coord.md
T
b612 16c62a97d5 feat: 完善时标与天象几何计算并扩展输出接口
- 新增时标、ΔT 模型、质心时间与 UT1 支持
- 改进日月食、月掩、行星事件及路径边界计算
- 完善恒星三维自行与动态距离传播
- 扩展 SVG、GeoJSON、KML 输出与底层距离换算工具
- 整理中英文手册、示例资源及回归测试
2026-09-23 18:55:12 +08:00

23 KiB
Raw Blame History

坐标工具

English | 返回 README

coord 提供天球坐标转换与观测辅助计算。没有特殊说明时,角度单位为度;恒星时单位为小时;time.Time 按绝对时刻使用,内部转换为 UTC 后计算。

高度角、天顶距与地平可见性的语义沿用观测角语义;站心几何的完整应用见月掩·站心事件图与日月位置;站心日食的初亏、食甚、复圆见日食。时标、观测点高度与整体精度的约定见时标约定、观测点高度约定与适用范围与精度。

目录

黄道坐标转赤道与地平坐标

package main

import (
	"fmt"
	"time"

	"b612.me/astro/coord"
)

func main() {
	cst := time.FixedZone("CST", 8*3600)
	date := time.Date(2026, 4, 27, 10, 30, 45, 0, cst)
	eq := coord.EclipticToEquatorial(date, 139.686111, 4.875278)
	hz := coord.EquatorialToHorizontal(date, eq.RA, eq.Dec, 115, 40)
	fmt.Printf("RA=%.6f Dec=%.6f deg\n", eq.RA, eq.Dec)
	fmt.Printf("azimuth=%.6f altitude=%.6f deg\n", hz.Azimuth, hz.Altitude)
	fmt.Printf("GAST=%.6f h\n", coord.ApparentSiderealTime(date))
}

赤经、赤纬和地平角均为度,恒星时为小时。这里的赤道坐标属于观测日期;银道转换要求 ICRS 坐标,不能直接混用。

API 参考

下面按计算内容列出接口、单位和返回值。

片段沿用首例中的 date、cst 与 eq。恒星时示例还需导入标准库 math。

黄道 ↔ 赤道

名称 用途 单位与口径
EclipticToEquatorial 黄道 → 赤道 黄经、黄纬、赤经、赤纬均为度;交角取该时刻的瞬时真交角,RA ∈ [0,360)
EquatorialToEcliptic 赤道 → 黄道 同一交角的反变换;Lon ∈ [0,360)、Lat ∈ [−90,90]
EclipticToEquatorialByObliquity 黄道 → 赤道(手工交角) 三个参数均为度;面向不同自转轴倾角的研究推演,不做日期换算
EquatorialToEclipticByObliquity 赤道 → 黄道(手工交角) 同上;Lon ∈ [0,360)、Lat ∈ [−90,90]
Ecliptic 黄道坐标结果 字段 Lon、Lat,单位度
Equatorial 赤道坐标结果 字段 RA、Dec,单位度
// date 见公共前置;先取该时刻的瞬时黄赤交角,再与按日期的接口对照。
obliquity := coord.EclipticObliquity(date, true)
auto := coord.EclipticToEquatorial(date, 139.686111, 4.875278)
manual := coord.EclipticToEquatorialByObliquity(139.686111, 4.875278, obliquity)
back := coord.EquatorialToEclipticByObliquity(manual.RA, manual.Dec, obliquity)
fmt.Printf("auto=(%.9f, %.9f) manual=(%.9f, %.9f)\n",
	auto.RA, auto.Dec, manual.RA, manual.Dec)
fmt.Printf("back=(%.9f, %.9f)\n", back.Lon, back.Lat)

赤道 ↔ 地平

名称 用途 单位与口径
EquatorialToHorizontal 瞬时赤道 → 地平 经纬度东正西负、北正南负,单位度;用视恒星时(含章动);Azimuth ∈ [0,360)、Altitude ∈ [−90,90]、Zenith = 90 − Altitude
EquatorialToHorizontalByLocalSiderealTime 赤道 → 地平(手工恒星时) 恒星时单位为小时,内部 ×15 转度;不查日期,适合手工推演
HourAngleDeclinationToHorizontal 时角 + 赤纬 → 地平 时角输入转 [0,360) 后归一输出;Azimuth ∈ [0,360)
HorizontalToHourAngleDeclination 地平 → 时角 + 赤纬 返回时角归一到 [0,360)(不是 [−180,180]),赤纬 [−90,90]
HorizontalToEquatorialByLocalSiderealTime 地平 → 赤道(手工恒星时) 恒星时小时;RA ∈ [0,360)
Horizontal 地平坐标结果 字段 Azimuth、Altitude、Zenith、HourAngle,均度
// 观测点取 115°E, 40°N;eq 见公共前置。
hz := coord.EquatorialToHorizontal(date, eq.RA, eq.Dec, 115, 40)
manual := coord.EquatorialToHorizontalByLocalSiderealTime(10.5, eq.RA, eq.Dec, 40)
hz2 := coord.HourAngleDeclinationToHorizontal(hz.HourAngle, eq.Dec, 40)
ha, dec := coord.HorizontalToHourAngleDeclination(hz2.Azimuth, hz2.Altitude, 40)
eq2 := coord.HorizontalToEquatorialByLocalSiderealTime(10.5, hz2.Azimuth, hz2.Altitude, 40)
fmt.Printf("auto=(%.6f, %.6f, %.6f) manual=(%.6f, %.6f)\n",
	hz.Azimuth, hz.Altitude, hz.Zenith, manual.Azimuth, manual.Altitude)
fmt.Printf("roundtrip ha=%.6f dec=%.6f ra=%.6f\n", ha, dec, eq2.RA)

站心坐标

名称 用途 单位与口径
TopocentricEquatorial 地心赤道 → 站心赤道 distanceAU 为地心距、AU;height 为椭球高、米;RA 只加视差小改正、不做 360° 归一
TopocentricEcliptic 地心黄道 → 站心黄道 同上;内部先解站心赤道坐标再转黄道,Lon 归一到 [0,360)、Lat 落在 [−90,90]
Ecliptic / Equatorial 返回值类型 字段口径同黄道 ↔ 赤道分组
// 目标地心距 0.00257 AU(约月球),观测点 115°E, 40°N,椭球高 53 m。
top := coord.TopocentricEquatorial(date, eq.RA, eq.Dec, 115, 40, 0.00257, 53)
topEcl := coord.TopocentricEcliptic(date, 139.686111, 4.875278, 115, 40, 0.00257, 53)
fmt.Printf("top=(%.9f, %.9f) dRA=%.9f dDec=%.9f\n",
	top.RA, top.Dec, top.RA-eq.RA, top.Dec-eq.Dec)
fmt.Printf("topEcl=(%.9f, %.9f)\n", topEcl.Lon, topEcl.Lat)

站心几何在月掩里用于逐地点接触时刻,见站心事件图;sun、moon 的站心物理量见日月位置。

恒星时

名称 用途 单位与口径
MeanSiderealTime 格林尼治平恒星时 小时;先把民用时刻换成 UT1,模型为 IAU 2006(ERA 路线)
ApparentSiderealTime 格林尼治视恒星时 小时;平恒星时叠加 IAU 2000B 黄经章动的投影
HourAngle 由瞬时赤经与站经求时角 经度东正西负、度;时角 [0,360);基于视恒星时
// 本地恒星时 = 格林尼治恒星时 + 东经/15,再折回 [0,24) 小时;math 仅用于这一步。
gmst := coord.MeanSiderealTime(date)
gast := coord.ApparentSiderealTime(date)
lst := math.Mod(gmst+115.0/15, 24)
fmt.Printf("GMST=%.9f h GAST=%.9f h LST=%.9f h\n", gmst, gast, lst)
fmt.Printf("HA=%.6f deg\n", coord.HourAngle(date, eq.RA, 115))

岁差与章动

名称 用途 单位与口径
Precess 赤道坐标从一个日期岁差到另一个日期 RA/Dec 单位度;两个日期都是民用时刻;只做岁差旋转,不含自行
EclipticObliquity 黄赤交角 度;nutation=false 给 IAU 1980 平交角,true 再叠加 IAU 2000B 交角章动
Nutation2000B IAU 2000B 章动 返回 (黄经章动, 交角章动),度
Nutation1980 IAU 1980 章动 返回 (黄经章动, 交角章动),度
// 把 J2000 的赤道坐标岁差到 date,并列出两套章动供对照。
j2000 := time.Date(2000, 1, 1, 12, 0, 0, 0, time.UTC)
p := coord.Precess(j2000, date, 83.6331, 22.0145)
dLon2000B, dObl2000B := coord.Nutation2000B(date)
dLon1980, dObl1980 := coord.Nutation1980(date)
fmt.Printf("precessed=(%.9f, %.9f)\n", p.RA, p.Dec)
fmt.Printf("eps mean=%.9f true=%.9f\n",
	coord.EclipticObliquity(date, false), coord.EclipticObliquity(date, true))
fmt.Printf("nut 2000B=(%.9f, %.9f) 1980=(%.9f, %.9f)\n",
	dLon2000B, dObl2000B, dLon1980, dObl1980)

银道坐标

名称 用途 单位与口径
EquatorialToGalactic ICRS 赤道 → 银道 输入 ICRS 度;Lon ∈ [0,360)、Lat ∈ [−90,90];固定旋转矩阵,不做岁差与自行
GalacticToEquatorial 银道 → ICRS 赤道 同一矩阵的转置;RA ∈ [0,360)
Galactic 银道坐标结果 字段 Lon、Lat,单位度
// 银心方向 ICRS (266.4051, -28.936175) 应回到银经 0、银纬 0 附近。
gal := coord.EquatorialToGalactic(266.4051, -28.936175)
back := coord.GalacticToEquatorial(gal.Lon, gal.Lat)
fmt.Printf("gal=(%.6f, %.6f) back=(%.9f, %.9f)\n", gal.Lon, gal.Lat, back.RA, back.Dec)

角距离

名称 用途 单位与口径
AngularSeparation 两组赤道坐标的角距离 输入、输出均为度;大圆角距,与输入顺序无关
// 蟹状星云脉冲星方向与银心方向的角距。
sep := coord.AngularSeparation(83.6331, 22.0145, 266.4051, -28.936175)
fmt.Printf("sep=%.9f deg = %.6f arcsec\n", sep, sep*3600)

大气折射

名称 用途 单位与口径
ApparentAltitude 真高度 → 视高度 高度角与返回值均为度;气压 hPa、气温 ℃
TrueAltitude 视高度 → 真高度 对 Saemundsson 模型做数值逆解;无解返回 NaN
AtmosphericRefractionFromTrueAltitude 真高度处的折射量 度;加到真高度上得视高度
AtmosphericRefractionFromApparentAltitude 视高度处的折射量 度;从视高度减去得真高度
EquatorialToApparentHorizontal 赤道 → 视地平 在 EquatorialToHorizontal 结果上叠加折射,只改 Altitude/Zenith,不动 Azimuth/HourAngle
// 真高度 10°,标准气压 1010 hPa、气温 0 ℃。
apparent := coord.ApparentAltitude(10, 1010, 0)
ref := coord.AtmosphericRefractionFromTrueAltitude(10, 1010, 0)
appHz := coord.EquatorialToApparentHorizontal(date, eq.RA, eq.Dec, 115, 40, 1010, 0)
fmt.Printf("true=10 apparent=%.9f ref=%.9f\n", apparent, ref)
fmt.Printf("back=%.9f appHz alt=%.6f zen=%.6f\n",
	coord.TrueAltitude(apparent, 1010, 0), appHz.Altitude, appHz.Zenith)

大气质量

名称 用途 单位与口径
AirmassPlaneParallelFromTrueAltitude 平行平板模型 输入真高度、度;等价 sec(z),中高空适用,近地平发散
AirmassKastenYoungFromApparentAltitude Kasten-Young 1989 输入视高度、度;不自动做折射修正
AirmassPickeringFromApparentAltitude Pickering 2002 输入视高度、度;面向低空观测
AirmassKastenYoungFromTrueAltitude 先折射再 Kasten-Young 真高度、度;气压 hPa、气温 ℃
AirmassPickeringFromTrueAltitude 先折射再 Pickering 同上
// 真高度 10°,标准气压 1010 hPa、气温 0 ℃;FromTrueAltitude 内部先做折射。
apparent := coord.ApparentAltitude(10, 1010, 0)
fmt.Printf("plane=%.9f\n", coord.AirmassPlaneParallelFromTrueAltitude(10))
fmt.Printf("ky true=%.9f apparent=%.9f\n",
	coord.AirmassKastenYoungFromTrueAltitude(10, 1010, 0),
	coord.AirmassKastenYoungFromApparentAltitude(apparent))
fmt.Printf("pickering true=%.9f apparent=%.9f\n",
	coord.AirmassPickeringFromTrueAltitude(10, 1010, 0),
	coord.AirmassPickeringFromApparentAltitude(apparent))

只剩纯公式、不需要坐标层折射时,用 formula 的大气质量模型三模型。

视差角

名称 用途 单位与口径
ParallacticAngle 由瞬时赤经赤纬求视差角 经纬度单位度;内部走时角 + 赤纬,返回 (−180,180]
ParallacticAngleByHourAngle 由时角求视差角 时角、赤纬、纬度单位度;返回 (−180,180]
// 视差角用于相机旋转、光谱缝方向和视场姿态判断。
q := coord.ParallacticAngle(date, eq.RA, eq.Dec, 115, 40)
q2 := coord.ParallacticAngleByHourAngle(coord.HourAngle(date, eq.RA, 115), eq.Dec, 40)
fmt.Printf("q=%.9f qByHA=%.9f\n", q, q2)

视差角的方向定义沿用观测角语义。

常用场景

黄道与地平坐标的往返转换

eq := coord.EclipticToEquatorial(date, 139.686111, 4.875278)
hz := coord.EquatorialToHorizontal(date, eq.RA, eq.Dec, 115, 40)
back := coord.EquatorialToEcliptic(date, eq.RA, eq.Dec)
fmt.Println(eq.RA, eq.Dec, hz.Altitude, back.Lon)
143.72223158223719 19.53512536790277 -17.686511328302952 139.68611100000000

只给时刻与坐标就够,库内部按当日视黄赤交角换算;要自己指定交角用 EclipticToEquatorialByObliquity / EquatorialToEclipticByObliquity 研究入口。往返自洽:EquatorialToEcliptic(EclipticToEquatorial(...)) 在同口径下回到原值。

站心改正与恒星时

top := coord.TopocentricEquatorial(date, eq.RA, eq.Dec, 115, 40, 0.00257, 53)
fmt.Println(top.RA, top.Dec)
fmt.Println(coord.MeanSiderealTime(date), coord.ApparentSiderealTime(date))
// 已有地方恒星时时可直接用它,不必让库重算:
manual := coord.EquatorialToHorizontalByLocalSiderealTime(10.5, 83.6331, 22.0145, 31.2)
fmt.Println(manual.Azimuth, manual.Altitude, manual.HourAngle)
144.25512626944376 18.79025523004319
16.852455700085 16.852556781127
281.869347 24.489608 73.8669

distanceAU 必须给真实地心距(月球约 0.00257 AU);较远天体是否可以忽略视差,取决于所需精度。height 是椭球高(米),恒星时单位是小时。

蒙气差、大气质量与视差角

fmt.Println(coord.ApparentAltitude(10, 1010, 0))                   // 真高 10° -> 视高
fmt.Println(coord.TrueAltitude(10.093428, 1010, 0))                // 视高 -> 真高(逆解)
fmt.Println(coord.AirmassKastenYoungFromTrueAltitude(10, 1010, 0)) // 真高 10° 的大气质量
fmt.Println(coord.ParallacticAngle(date, eq.RA, eq.Dec, 115, 40))  // 相机/光谱缝旋转角
10.093427592862
10.000000410649
5.537933369472
-34.000957202636

蒙气差只在真高度角 (-5°, 90°) 内生效,区间外不修正;大气质量族另有只按视高度角的简化入口(...FromApparentAltitude)。

岁差章动与交角口径

fmt.Println(coord.EclipticObliquity(date, true)) // 真交角;false 给平交角
lon, obl := coord.Nutation2000B(date)            // IAU 2000B 黄经/交角章动
pre := coord.Precess(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), date, eq.RA, eq.Dec)
fmt.Println(lon, obl, pre.RA, pre.Dec)
23.438261476424
0.001652570533 0.002392788113 144.089973153762 19.416731576422

Nutation1980 与 Nutation2000B 都可显式调用,便于逐项对表;Precess 只做岁差,不含自行、章动与光行差。手动恒星时、手动交角这类研究入口集中在研究型接口与观测辅助。

研究型接口与观测辅助

coord 里的研究型接口不会自动代入当前日期的黄赤交角或恒星时,适合做“不同自转轴倾角”“手工指定时角”这类推演。常规计算可用 EclipticToEquatorial、EquatorialToHorizontal 等带 time.Time 的接口。

观测辅助接口包括:

  • ParallacticAngle / ParallacticAngleByHourAngle:视差角(天顶方向角)
  • Airmass...FromApparentAltitude:已经有视高度角时,直接套经验式
  • Airmass...FromTrueAltitude:先按给定气压/气温估算折射,把真高度角换成视高度角后再算
// 目标的视差角,常用于旋转相机、光谱缝方向和视场姿态判断。
q := coord.ParallacticAngle(date, eq.RA, eq.Dec, 115, 40)

// 已知真高度角时,可先估算折射,再按经验模型求大气质量。
x := coord.AirmassKastenYoungFromTrueAltitude(10, 1010, 0)
fmt.Printf("q=%.6f airmass=%.6f\n", q, x)

同样的观测辅助接口在 sun、moon、star 以及七大行星包中都有提供。已有视高度角且只需要纯公式时,formula.Airmass... 更直接。

参数与返回值约定

单位约定

  • 角度一律为度:黄经/黄纬、赤经/赤纬、方位/高度/天顶距/时角、视差角、角距离。需要角秒时自行 ×3600(如 AngularSeparation 的返回值)。
  • 恒星时一律为小时:MeanSiderealTime、ApparentSiderealTime 的返回值和 *ByLocalSiderealTime 的 localSiderealTimeHours 参数都是小时;内部按 ×15 换成度,不要与赤经的小时表示混用。
  • Equatorial.RA、Galactic.Lon、Horizontal.Azimuth、Horizontal.HourAngle 都是度,不是小时;Equatorial 类型不区分 J2000、日期平坐标还是瞬时真坐标,由调用者保证输入口径一致。
  • 距离用 AU(TopocentricEquatorial、TopocentricEcliptic 的 distanceAU);观测点高度用椭球高(大地高),单位米,不建模大地水准面差距,详见观测点高度约定。
  • 气压 hPa、气温 ℃;折射按标准状态 1010 hPa、10 ℃ 定标。
  • 本包不产生视直径/视半径;日月与日食手册里的视半径字段以角秒计,不要与本包的“度”互换。

时标

  • 所有公开接口的 time.Time 按绝对时刻(民用时刻)使用,内部先 date.UTC() 再转儒略日;数值本身一律按 UTC 标签解释,1972-01-01 之前它等于 UT1。完整约定见时标约定。
  • 恒星时链路显式做 UT1 换算:MeanSiderealTime / ApparentSiderealTime 走 UTC2UT1 后的 IAU 2006 模型;HourAngle、EquatorialToHorizontal、TopocentricEquatorial 内部的视恒星时同样基于 UT1。
  • Precess(from, to) 的 from、to 都是民用时刻,按各自的绝对时刻取岁差历元。
  • 折射与大气质量不涉及时刻,只依赖高度角与气象参数。

角度象限与归一

  • 内部 normalize360 把所有需要展示的角归一到 [0,360):赤经、黄经、银经、方位角、时角都落在这个区间。
  • 赤纬、黄纬、银纬、高度角经 Asin(部分路径额外做 [−1,1] 夹取)后落 [−90,90]。
  • ParallacticAngle / ParallacticAngleByHourAngle 用 Atan2,返回 (−180,180],是本包唯一带符号的角。
  • 站心族是例外:TopocentricEquatorial.RA 是输入赤经加一个小改正,不做 360° 归一,目标靠近 0°/360° 边界时结果可能略越界;TopocentricEcliptic 的 Lon 归一到 [0,360)、Lat 经 Asin 落在 [−90,90](内部先解站心赤道坐标再转黄道)。
  • HourAngleDeclinationToHorizontal 与 HorizontalToHourAngleDeclination 的时角都归一到 [0,360),所以子午线以西的负时角在这里表现为 360−|HA|;要带符号时角请自行减 360。
  • EquatorialToHorizontal 与 HourAngleDeclinationToHorizontal 给出的都是几何高度角,不含蒙气差;需要视高度用 EquatorialToApparentHorizontal 或 ApparentAltitude。

零值与无效输入

  • 折射族要求 pressureHPa > 0、temperatureC > −273.15,任一参数为 NaN/Inf 或越界即返回 NaN。
  • 真高度 ≤ −5° 或 ≥ 90° 时折射量按 0 处理:ApparentAltitude 原样返回真高度,TrueAltitude 与 AtmosphericRefractionFromApparentAltitude 原样返回输入视高度;TrueAltitude 只在 (−5°, 90°) 内做数值逆解,逆解失败返回 NaN。
  • 大气质量族把高度角(或天顶距)限制在 [0,90],越界或非有限返回 NaN;平行平板在高度角恰为 0°(天顶距恰为 90°)时返回 +Inf,Kasten-Young 与 Pickering 在 0° 处仍是有限值。
  • EquatorialToApparentHorizontal 把气压/气温直接透传给折射函数:非法气象参数会让 Altitude 变 NaN、Zenith 随之为 NaN,而 Azimuth、HourAngle 仍是几何值。
  • 站心族对 distanceAU 与 height 不做校验,distanceAU 填 0 或负值会得到无意义结果;必须传真实地心距(月球约 0.00257 AU)。
  • 银道、角距离等纯几何接口不做参数校验,非有限输入会传播成 NaN,黄纬超出 [−90,90] 也不会被夹取,而是按球面方向重新解释。
  • 四个坐标类型没有 Valid 字段:Ecliptic{}、Equatorial{}、Horizontal{}、Galactic{} 表示“全 0 角”而不是“未设置”,不能用零值做缺省判断。

精度与适用范围

  • 黄赤交角:平均项取 IAU 1980 模型,EclipticObliquity(date, true) 在其上叠加 IAU 2000B 交角章动;Nutation1980 与 Nutation2000B 都可用,需要逐项对照时显式调用。
  • 恒星时:走 IAU 2006 的 ERA 路线,视恒星时叠加 IAU 2000B 黄经章动;同一儒略日的视恒星时做了有界记忆化,注入 ΔT 覆盖会按世代失效。
  • 岁差:Precess 在赤道坐标上做长期岁差旋转(赤道极/黄极向量含周期项),不含自行、章动与光行差;它适合把一个历元的平坐标转到另一个历元,不能代替完整的“J2000 → 当日视位置”链路。
  • 银道:使用固定的 ICRS ↔ Galactic 旋转矩阵,等价于 SOFA 的 iauIcrs2g/iauG2icrs,只适用于 ICRS 口径的输入。
  • 站心改正:周日视差量级随 distanceAU 反比变化,月球最大(约 1°),较远天体是否可忽略应按精度要求判断;height 只影响视差项的幅度,量级为米级高程对应的角秒级差异。
  • 站心黄道坐标由站心赤道坐标换算(basic.TopocentricLoBo 一次求值给出黄经与黄纬):TopocentricEcliptic.Lat 保证落在 [−90,90],并与 EquatorialToEcliptic(TopocentricEquatorial(...)) 这条独立路径一致。
  • 折射:Saemundsson 公式,有效真高度窗口 (−5°, 90°),窗口外不修正;低空(< 5°)折射变化剧烈,气压 ±1 hPa、气温 ±1 ℃ 都会带来可见误差。
  • 大气质量:三种经验模型在中高空接近,低空差异最大;平行平板只是几何近似,接近地平线发散,低空精细估算用 Kasten-Young 或 Pickering,纯公式见 formula 的大气质量模型。
  • 视差角:ParallacticAngle 用瞬时赤经赤纬与站点经纬度,ParallacticAngleByHourAngle 用同一几何的时角形式,两者对同一几何应给出一致结果。

观测点高度

站心坐标、升落、地方日月食与月掩接口的高度参数均为椭球高,单位米。正高(海拔)H 与椭球高的关系是 height = H + N,其中 N 为当地大地水准面差距。

库内不提供大地水准面模型,所以 height=0 表示参考椭球面,不一定是当地平均海面。需要这一级精度时,应从外部模型取得 N;与外部预报对照时也应统一高度定义。

作为量级估算,30 米高差在高度角 30° 的光线方向上对应约 52 米水平位移,即 |Δh|·cot(高度角)。接触时刻的差异还取决于当地影子速度和接触几何,不能视为固定秒数的修正。