使用方法
- 在「日期」里选 2026-10-02。可选范围是 1900-01-01 到 2100-12-31,填成别的年份会在下方红框里点名是哪个字段越界。
- 在「时刻」里填 20:00。这里按 24 小时制,最小步长 1 分钟;留空时按 00:00 处理。
- 在「时区偏移」里填 8,表示北京时间 UTC+8。范围是 −12 到 +14,步长 0.25,所以印度填 5.5、尼泊尔填 5.75 都能精确保留。
- 按 Enter 或点「计算月相」。示例这一刻算出:相位角 251.7°、月龄 20.65 天、照亮 65.7%、阶段 下弦月、盈亏方向为渐亏。
- 再往下看「下一次相位」表,示例给出距下次下弦 1.502 天、距下次新月 8.885 天、距下次满月 23.650 天,时刻都已按你填的时区换算过。
- 点「复制结果」把八项指标一起带走;点「用此刻」会把日期和时刻换成你设备当前的本地时间,时区偏移那一栏保持你填的值不变——因为浏览器并不知道你在哪个时区。
这个月相阶段计算器能解决什么问题
一是给观星和摄影挑日子。月光是夜景和深空摄影最大的干扰源,真正适合拍银河的窗口是新月前后两三天的残月和新月阶段(相位角在 337.5°–22.5° 之间);反过来想拍满月地景,就要把相位角对到 157.5°–202.5° 这一档。
二是核对「某一天是不是满月」这类说法。口头相传的「十五的月亮十六圆」指的是农历日期,而相位角是连续量:月亮在满月前后各 22.5°(约 ±1.85 天)内看起来都接近圆,本页给出的是连续角度而不是离散的「是/否」。
三是给文案、课件、排版稿核月相。写「当天是上弦月」之前先查一下角度,避免出现上弦月却配了满月插图这类硬伤。
四是把「月龄」这个量讲清楚。很多人把月龄当成农历日期,其实它只是距上一次新月的天数,取值范围是 0 到 29.53;农历日期还要考虑定朔时刻、闰月和时区,两者不是一回事。
本页不做这些事:不算月出月落与中天时刻(那需要观测地经纬度)、不算月亮所在的星座或赤纬、不做农历与公历的日期互转、也不判断南北半球看到的月面朝向(同一相位角在南半球看起来是左右翻转的)。要算两个日期之间相差多少天请用日期差值计算器,要把某个日期往后推若干天请用日期加天数计算器。
相位角与八相的计算原理
核心公式只有一条:把目标时刻减去一个已知的新月时刻,除以平均朔望月,取余数的小数部分再乘 360°,就是相位角。写成算式是 θ = ((t − t₀) mod 29.530588853) ÷ 29.530588853 × 360°,其中 t₀ 取 2000-01-06 18:14 UTC(儒略日约 2451550.26),t 与 t₀ 的差用毫秒差除以 86400000 换算成天。月龄就是那个余数本身,单位是天。
为什么周期取 29.530588853 而不是 29.53 或 29.5。这是 J2000 历元的平均朔望月,折合 29 天 12 小时 44 分 2.9 秒。若用 29.53,每个朔望月就累积 0.000588853 天(约 50.9 秒)的系统偏差;一年有 365.25 ÷ 29.530588853 ≈ 12.37 个朔望月,一年累积约 10.5 分钟,十年约 1.75 小时——已经足以把「满月出现在哪一天」推到相邻的日期上。若图省事用 29.5,每个周期差 0.030588853 天(约 44 分钟),一年就差 9 小时,结果基本不可用。
八相的划分是「就近取整」而不是「按 45° 切八段」。八个名称各对应一个中心角度,每相邻两个相距 45°,折合 29.530588853 ÷ 8 = 3.6913 天。判定用 index = floor(((θ + 22.5°) mod 360°) ÷ 45°),也就是给每个中心角留出 ±22.5° 的半宽:θ = 251.690° 落在 247.5°–292.5° 里,所以是下弦月而不是亏凸月。±22.5° 折合 44.30 小时,这就是「同一阶段」在时间上的宽度。
照亮比例用的是几何近似:k = (1 − cos θ) ÷ 2。θ = 0° 时 k = 0,θ = 90°(上弦)时 k = 0.5,θ = 180° 时 k = 1。它假设太阳光是平行光、月球是理想球体,不含地影(那是月食的范畴),也不含月面反照率随入射角变化的真实光变——所以「照亮 50%」不等于「看起来亮了一半」,人眼对低照度非常敏感,10% 照亮的月牙在暗夜已经相当显眼。
依据的标准与数据链:平均朔望月数值与月球位置的理论取自 Meeus《Astronomical Algorithms》第 47 章(月球视黄经展开)与第 49 章(朔望时刻),月相阶段计算器只用了它的平均周期项,没有代入月亮和太阳的中心差、出差、二均差等周期改正项。时刻一律按 UTC 处理,不引入闰秒——JavaScript 的 Date 基于 Unix 毫秒,把每一天都当作 86400000 毫秒,这与含闰秒的 UTC 之间有累计约 27 秒的量级差,对本页的精度不构成影响。
常见误用的正确解释:把「月龄 20.65 天」当成「农历二十」是最典型的误读。月龄是一个纯几何量,农历日期则由实际合朔时刻加时区决定,两者可以相差一两天;反过来,看到「上弦月」就以为「上半夜才有月亮」也不对,上弦月是相位角 90° 这一状态,它大约在正午升起、午夜落下,上半夜确实可见,但描述的是相位而不是出没时间。
完整示例(数值仅作演示)
示例条件就是月相阶段计算器打开时三个输入框里的默认值:日期 2026-10-02、时刻 20:00、时区偏移 +8。逐步换算如下,每一步的中间量都列出来,可以拿计算器对拍:
- 把挂钟时间换成 UTC:20:00 减去 8 小时,得到 UTC 2026-10-02 12:00。
- 减历元:该时刻与 2000-01-06 18:14 UTC 相差 9765.7403 天。
- 数朔望月:9765.7403 ÷ 29.530588853 = 330.6991,整数部分 330 是已经过去的完整朔望月个数,小数部分 0.6991 是当前这一轮的进度。
- 算月龄:0.6991 × 29.530588853 = 20.6460 天,这就是「距上一次新月多久」。
- 算相位角:20.6460 ÷ 29.530588853 × 360° = 251.690°。
- 算照亮比例:(1 − cos 251.690°) ÷ 2 = 65.71%。
- 定阶段:(251.690 + 22.5) ÷ 45 = 6.093,向下取整得 6,对应 下弦月(判定区间 247.5°–292.5°);因为 θ 大于 180°,盈亏方向为渐亏。
- 推下次相位:从 251.690° 各中心角还差多少度,换算成天,得到距下弦 1.502 天(2026-10-04 08:02)、距新月 8.885 天(2026-10-11 17:13)、距上弦 16.267 天(2026-10-19 02:24)、距满月 23.650 天(2026-10-26 11:35),时刻均按 UTC+8 显示。
八相角度与月龄对照表
八个阶段各占 45°,彼此相距 3.6913 天。下表把中心角、月龄、判定区间和该角度上的照亮比例列在一起,左边进度条高亮的那一格就是当前阶段:
| 阶段 | 中心相位角 | 月龄(天) | 判定区间 | 中心角处照亮 |
|---|---|---|---|---|
| 🌑 新月 | 0° | 0.0000 | 337.5°–22.5° | 0.0% |
| 🌒 娥眉月 | 45° | 3.6913 | 22.5°–67.5° | 14.6% |
| 🌓 上弦月 | 90° | 7.3826 | 67.5°–112.5° | 50.0% |
| 🌔 盈凸月 | 135° | 11.0740 | 112.5°–157.5° | 85.4% |
| 🌕 满月 | 180° | 14.7653 | 157.5°–202.5° | 100.0% |
| 🌖 亏凸月 | 225° | 18.4566 | 202.5°–247.5° | 85.4% |
| 🌗 下弦月 | 270° | 22.1479 | 247.5°–292.5° | 50.0% |
| 🌘 残月 | 315° | 25.8393 | 292.5°–337.5° | 14.6% |
角度偏差和时间偏差是线性关系:相位角每走 1° 相当于时间上走 29.530588853 ÷ 360 × 24 = 1.9687 小时。下面这张表把常见的几个角度换算成小时,用于判断误差会不会跨过某一天:
| 角偏差 | 折合时间 | 意味着什么 |
|---|---|---|
| 1° | 1.97 小时 | 同一个小时量级的误差,不影响日期判断 |
| 5.14° | 10.11 小时 | 2026–2027 两年逐日实测的均方根偏差 |
| 10.99° | 21.64 小时 | 实测最大偏差(出现在 2027-09-06),已接近一整天 |
| 22.5° | 44.30 小时 | 八相判定的半宽,超过它就判错一个阶段 |
| 45° | 88.59 小时 | 整整一个阶段,约 3.69 天 |
输入范围、边界与精度说明
- 日期边界是 1900-01-01 到 2100-12-31。这不是
Date的能力上限(它能表示到 ±27 万年),而是精度上的自我设限:只用一个平均周期做线性外推,离历元越远,忽略掉的周期改正项越可能叠加,超出这个区间本页直接拒绝并提示年份字段。 - 越界与非法输入都有字段级文案。日期格式不是
YYYY-MM-DD、月份填了 13、时刻不是HH:MM、时区偏移超出 −12 到 +14,都会分别指出是哪个字段、允许什么范围,不会静默把结果算成 0 或 NaN。 - 时区偏移步长 0.25 小时。整数时区没有问题,半小时时区(印度 +5.5)和 45 分钟时区(尼泊尔 +5.75)也能精确填写;如果嫌麻烦填成 6,就相当于把时刻挪后 15 分钟,折算成相位角是 0.19°,通常不影响阶段判定。
- 本算法的误差来自被省略的周期改正项。月球绕地球的轨道偏心率、出差、二均差等扰动使真实合朔时刻相对平均周期前后摆动。拿 Meeus 第 47 章的月球视黄经展开加第 25 章的太阳视黄经做参照,对 2026-01-01 至 2027-12-31 共 730 天逐日比对,本页简化法的角偏差最大 10.99°(折合 21.64 小时)、均方根 5.14°(10.11 小时)。也就是说:判断「大致处于哪个阶段」足够,判断「满月精确到几时几分」不够。
- 在阶段边界附近要特别注意。既然半宽是 ±22.5°(44.30 小时),而典型偏差就能到 10 小时量级,那么当算出的角度距离某个区间边界不到 5° 时,实际阶段可能落在相邻那一格。
- 历元本身也有约 2 分钟的固有差。用本页公式算 2000-01-06 18:14 UTC 得到相位角 0.000°,而参照算法在同一时刻给出 359.982°,差 0.018° 折合约 2.1 分钟——这是把历元近似当成精确合朔时刻带来的,不是计算错误。
- 不处理闰秒,也不做日历改革。时间轴按每天 86400000 毫秒均匀推进;1582 年之前的儒略历日期不做格里历校正,这也是把下限定在 1900 年的原因之一。
- 「用此刻」按钮读的是设备本地时间。如果你设备的时区设置和实际所在地不一致,结果会跟着错;手工填时区偏移才可靠。
常见问题
为什么这里算的满月时间和手机日历差几个小时?
因为本页用的是平均朔望月线性外推,省略了月球运动的周期改正项。实测与精确展开相比最大可差约 21.6 小时、典型差 10 小时量级。手机日历和专业星历软件查的是带改正项的朔望时刻,要精确到分钟请以它们为准;月相阶段计算器用来判断阶段和挑日子是够的。
「月龄 20.65 天」是不是就是农历二十?
不是。月龄是距上一次新月的天数,是连续量,取值 0 到 29.53;农历日期由实际合朔时刻加时区决定,还要处理闰月,两者经常差一两天。本页不做农历换算。
为什么我填的日期和结果里的 UTC 时刻差了 8 小时?
因为时区偏移填的是 +8。本页先把你填的挂钟时间当成 UTC+8 的本地时间,再减去 8 小时换成 UTC,然后才减历元。结果卡片里同时列出了该时区的 UTC 时刻和「距下次新月」的本地时刻,方便核对。
时区偏移能不能填小数?
能,步长是 0.25 小时。印度填 5.5、尼泊尔填 5.75 都可以。填成整数近似也不会报错,只是时刻会偏 15 到 45 分钟,折算成相位角不到 0.6°。
日期能算到 1900 年之前或者 2100 年之后吗?
不能,本页把范围限定在 1900-01-01 到 2100-12-31,越界时会在红框里点名年份字段。离历元越远,被省略的周期改正项累积得越多,线性外推的结果就越不可靠,所以宁可拒绝也不给一个看着像样的数字。
上弦月到底是上半月还是上半夜?
是相位角 90° 这一状态,与「上半月」无关(一个朔望月 29.53 天,上弦出现在第 7.38 天,确实在前半段,但这是巧合式的描述,不是定义)。它大约在正午升起、午夜落下,所以上半夜能看到;描述出没时间需要月出月落计算,本页不提供。
「照亮 50%」为什么看起来不像一半?
照亮比例是几何量 (1 − cos θ) ÷ 2,描述被太阳照亮的月面圆盘占整个可见半球的比例;人眼对亮度的感受是非线性的,加上月面地形反光并不均匀,所以 50% 照亮的弦月在肉眼看来往往比「一半亮」更亮一些。
计算结果会上传或者被保存吗?
不会。相位角、月龄、照亮比例和下一次相位时刻全部由页面里的算术算出,不发出任何网络请求,也不写入浏览器存储,刷新后输入框回到默认值。想自己核实,可以打开开发者工具的 Network 面板,点「计算月相」时观察是否有请求发出。