ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

# 真太阳时校正的工程实现:经度时差公式、夏令时叠加与代码详解(附源码)

# 真太阳时校正的工程实现:经度时差公式、夏令时叠加与代码详解(附源码) 引言同一个 12 点两个城市不是同一个时刻中国横跨 5 个时区但全国统一使用北京时间东经 120° 标准时。这就产生一个工程问题一个出生在北京、一个出生在乌鲁木齐的人都记中午 12 点——但乌鲁木齐的太阳那时才刚过 10 点。对历法计算来说这个差异不能忽略真太阳时影响日柱跨日边界和时辰归属午时/未时的分界北京与乌鲁木齐经度差约 28.8°时间差约1 小时 55 分钟——足以让午时变巳时。本文给出真太阳时校正的工程实现全部代码来自开源项目bazi-engine438KB 单文件零依赖浏览器/Node 双端可用。一、公式推导经度每差 1°时间差 4 分钟地球 24 小时自转 360°即每小时 15°每 1° 经度对应 4 分钟。北京时间以东经 120° 为基准所以任意城市的真太阳时真太阳时 北京时间 (当地经度 - 120) × 4 分钟东经 120° 以西为负时间更晚以东为正时间更早。二、代码实现城市经度表 校正函数引擎内置一份主要城市经度表东经constCITY_LON{北京:116.4,上海:121.5,广州:113.3,深圳:114.1,成都:104.1,乌鲁木齐:87.6,拉萨:91.1,哈尔滨:126.6,// ... 70 城市};// 真太阳时校正输入出生地 北京时间输出校正后的真实时刻functionsolarCorrection(place,bjTime){if(!place)returnnull;letlonnull;for(constcinCITY_LON){if(place.indexOf(c)0){lonCITY_LON[c];break;}}if(lonnull)return{found:false};// 未匹配城市跳过校正constdiffMin(lon-120)*4;// 时差分钟consttotalbjTime.getTime()diffMin*60000;return{found:true,lon:lon,diffMin:diffMin,time:newDate(total)};}三、实测数据四大城市差多少用引擎实测北京时间 12:00 整城市经度时差 diffMin真太阳时北京116.4°E-14.4 分钟11:45:36成都104.1°E-63.6 分钟10:56:24拉萨91.1°E-115.6 分钟10:04:24乌鲁木齐87.6°E-129.6 分钟09:50:24北京到乌鲁木齐同一时刻相差115.2 分钟≈1 小时 55 分——两个中午 12 点真实时刻几乎差 2 个小时。四、边界处理 1校正后可能跨日真太阳时校正会把分钟往后拨负值极端情况会跨过 0 点改变日期——日期一变日柱就变了。引擎的处理方式校正后统一用校正时间重新取年月日时分再进入干支计算// 完整计算入口真太阳时开启时functionpaipan(name,gender,y,m,d,hh,mm,place,truesun){letuseYy,useMm,useDd,useHhh,useMinmm;if(truesunyes){constbjnewDate(y,m-1,d,hh,mm);constcorrsolarCorrection(place,bj);if(corrcorr.found){consttcorr.time;// 关键用校正后的时间重取年月日时分跨日自动处理useYt.getFullYear();useMt.getMonth()1;useDt.getDate();useHt.getHours();useMint.getMinutes();}}// 再用 useY/useM/useD/useH/useMin 计算四柱干支...}五、边界处理 2与夏令时叠加的顺序中国 1986-1991 年实行过夏令时。顺序必须是先回拨夏令时再做真太阳时校正——因为夏令时是钟表时间的人为调整真太阳时是天文时刻的地理校正两者针对的基准不同。// 第一步夏令时回拨1990 年 5 月 15 日 10:00 → 真实 9:00constadjBaziEngine.applyDst(1990,5,15,10,0);// { y:1990, m:5, d:15, hh:9, dst:1 }// 第二步回拨后再做真太阳时校正示例乌鲁木齐constcorrBaziEngine.solarCorrection(乌鲁木齐,newDate(1990,4,15,9,0));// { lon:87.6, diffMin:-129.6, time: 06:50:24 }夏令时只在 1986-1991 年生效引擎实测1990-01-15 冬季无夏令时10:00 不变1987-07-01 夏季回拨 1 小时8:30 → 7:30。六、为什么必须确定性测试兜底历法计算错一分钟就是错所以引擎的做法是13 套自动化回归测试paipan 28 项 / 农历 27 项 / E2E 验收等CI 门禁不绿不让合并同一输入永远同一输出——这是历法引擎的底线验证代码可直接运行constBrequire(./engine/engine.dist.js);// 立春分界2025-02-03 22:10 前属甲辰年之后属乙巳年B.yearGZ(2025,2,3,22,9);// 甲辰B.yearGZ(2025,2,3,22,11);// 乙巳// 真太阳时 夏令时叠加B.solarCorrection(乌鲁木齐,newDate(2025,4,15,12,0));// { lon: 87.6, diffMin: -129.6, time: ... }七、开源交付GitHubgithub.com/ruanxiaoer888/bazi-engineMIT 协议随便拿去用形态单文件 438KB、零外部依赖浏览器 / Node 双端可用能力导出 101 个 APIpaipan / applyDst / solarCorrection / lunarToSolar / calcShenSha 等数据1895-2100 共 206 年节气表立春/交节精确到分钟顺带一提我还把它做成了一个在线产品**「本初」**——它不预测什么只把你出生的那一刻翻译成一份可以读的「出厂说明书」。从出生之初认识本来的你。在线体验https://benchu.xiaoerpro.com/如果你对真太阳时、历法计算感兴趣⭐ 给仓库点个 stargithub.com/ruanxiaoer888/bazi-engine 提 issue / PR一起把历法工程做严谨 评论区聊聊你的项目里时间校正还有哪些坑免责声明本文内容仅供历法技术研究与传统文化参考不构成任何专业建议。
返回列表