秋分は「昼と夜の長さが同じになる日」と説明されることが多い。実際には同じではない。2026年9月23日の東京は、昼のほうが夜より16〜18分長い。
ずれの理由は天文ではなく定義にある。計算してみると、どこで16分が生まれるかがはっきりする。
2つの定義
太陽の中心が地平線を通る瞬間を日の出・日の入りとするなら、秋分の日の昼と夜はほぼ等しくなる。しかし暦が採用しているのはそれではない。
- 太陽の上端が地平線にかかった時刻を日の出とする(中心ではない)。太陽の視直径はおよそ0.53度なので、半径ぶんの約0.27度だけ早まる
- 大気差(大気による屈折で太陽が浮き上がって見える効果)を約0.57度見込む
合わせて、高度 -0.833度 を地平線とみなす。日の出は早くなり、日の入りは遅くなる。両端で効くので、昼が二重に伸びる。
実装
NOAA の太陽位置アルゴリズムの簡易版である。外部ライブラリは使わない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| "use strict"; const rad = Math.PI / 180, deg = 180 / Math.PI;
function julianDay(y, m, d) { if (m <= 2) { y -= 1; m += 12; } const A = Math.floor(y / 100), B = 2 - A + Math.floor(A / 4); return Math.floor(365.25 * (y + 4716)) + Math.floor(30.6001 * (m + 1)) + d + B - 1524.5; }
function solar(jd) { const T = (jd - 2451545) / 36525; const L0 = (280.46646 + T * (36000.76983 + T * 0.0003032)) % 360; const M = 357.52911 + T * (35999.05029 - 0.0001537 * T); const C = Math.sin(M * rad) * (1.914602 - T * (0.004817 + 0.000014 * T)) + Math.sin(2 * M * rad) * (0.019993 - 0.000101 * T) + Math.sin(3 * M * rad) * 0.000289; const omega = 125.04 - 1934.136 * T; const lambda = L0 + C - 0.00569 - 0.00478 * Math.sin(omega * rad); const e0 = 23 + (26 + ((21.448 - T * (46.815 + T * (0.00059 - T * 0.001813)))) / 60) / 60; const e = e0 + 0.00256 * Math.cos(omega * rad); const decl = Math.asin(Math.sin(e * rad) * Math.sin(lambda * rad)) * deg; const y = Math.tan(e / 2 * rad) ** 2; const eqTime = 4 * deg * (y * Math.sin(2 * L0 * rad) - 2 * 0.016708634 * Math.sin(M * rad) + 4 * 0.016708634 * y * Math.sin(M * rad) * Math.cos(2 * L0 * rad) - 0.5 * y * y * Math.sin(4 * L0 * rad) - 1.25 * 0.016708634 ** 2 * Math.sin(2 * M * rad)); return { decl, eqTime }; }
function dayLength(y, m, d, lat, lon, tz, h0) { const jd = julianDay(y, m, d) + (12 - lon / 15 - tz) / 24; const { decl, eqTime } = solar(jd); const cosH = (Math.sin(h0 * rad) - Math.sin(lat * rad) * Math.sin(decl * rad)) / (Math.cos(lat * rad) * Math.cos(decl * rad)); if (cosH > 1 || cosH < -1) return null; const H = Math.acos(cosH) * deg; const noon = 720 - 4 * lon - eqTime + tz * 60; return { rise: noon - 4 * H, set: noon + 4 * H, minutes: 8 * H }; }
|
要点は h0 を引数にしてあることである。-0.833 が暦の定義、0 が「太陽の中心・大気差なし」。この2つを並べると、16分がどこから来たかが見える。
実際に試す
前提: Node.js 18 以降。上の関数に続けて次を書き、equinox.js として保存する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function hhmm(min) { const t = Math.round(min); return String(Math.floor(t / 60)).padStart(2, "0") + ":" + String(t % 60).padStart(2, "0"); }
const LAT = 35.6895, LON = 139.6917, TZ = 9; for (const d of [22, 23, 24, 25, 26]) { const a = dayLength(2026, 9, d, LAT, LON, TZ, -0.833); const b = dayLength(2026, 9, d, LAT, LON, TZ, 0); console.log( `2026-09-${d} 日の出 ${hhmm(a.rise)} 日の入り ${hhmm(a.set)} ` + `昼 ${hhmm(a.minutes)} 夜 ${hhmm(1440 - a.minutes)} ` + `差 ${(a.minutes - (1440 - a.minutes)).toFixed(1)}分 ` + `[中心・大気差なし: 差 ${(b.minutes - (1440 - b.minutes)).toFixed(1)}分]` ); }
|
手元の実行結果は次のとおりだった。
1 2 3 4 5
| 2026-09-22 日の出 05:29 日の入り 17:40 昼 12:11 夜 11:49 差 22.1分 [中心・大気差なし: 差 5.7分] 2026-09-23 日の出 05:29 日の入り 17:38 昼 12:09 夜 11:51 差 17.6分 [中心・大気差なし: 差 1.2分] 2026-09-24 日の出 05:30 日の入り 17:37 昼 12:07 夜 11:53 差 13.1分 [中心・大気差なし: 差 -3.3分] 2026-09-25 日の出 05:31 日の入り 17:35 昼 12:04 夜 11:56 差 8.7分 [中心・大気差なし: 差 -7.7分] 2026-09-26 日の出 05:32 日の入り 17:34 昼 12:02 夜 11:58 差 4.2分 [中心・大気差なし: 差 -12.2分]
|
読み取れることは2つある。
第一に、暦の定義(-0.833度)では9月23日でも昼が17.6分長い。昼夜が等しくなるのは秋分より数日あとになる。
第二に、中心・大気差なし(0度)にすると、9月23日の差は1.2分まで縮む。つまり「秋分は昼夜が等しい」という説明は、太陽を点として扱い大気差を無視した世界でならほぼ正しい。16分の差は天体の運行ではなく、日の出・日の入りの定義が作っている。
実測値と突き合わせる
計算しただけでは合っているか分からない。国立天文台暦計算室の日の出入り@東京 2026年9月と比べる。
| 日付 |
本記事の計算 |
国立天文台 |
| 9月22日 |
05:29 / 17:40 |
5:29 / 17:39 |
| 9月23日 |
05:29 / 17:38 |
5:29 / 17:37 |
| 9月24日 |
05:30 / 17:37 |
5:30 / 17:36 |
| 9月25日 |
05:31 / 17:35 |
5:31 / 17:34 |
日の出は一致、日の入りは1分遅い。簡易版アルゴリズムの打ち切り誤差と、観測地点の座標がわずかに違うこと(本記事は北緯35.6895度・東経139.6917度、天文台の表は北緯35.6581度・東経139.7414度)が効いている。用途が「何分ずれるか」であれば十分だが、正式な時刻が要る場合は暦計算室の値を使うこと。1分の差を自前計算で埋めようとしない。
まとめ
- 秋分の日の昼夜は等しくない。2026年9月23日の東京は昼が16〜18分長い
- 原因は太陽の上端基準(約0.27度)と大気差(約0.57度)で、合わせて高度 -0.833度を地平線としていること
h0 をパラメータにすれば、定義の違いがそのまま数値の違いとして出る
- 自前計算は1分程度ずれる。突き合わせ先を先に決めてから実装する