File size: 4,222 Bytes
1763ec8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
 * 真太阳时计算测试 (独立版本)
 */

// 计算真太阳时偏移(分钟)
function calculateTrueSolarTimeOffset(longitude) {
  return Math.round((longitude - 120) * 4);
}

// 测试城市数据
const CITIES = [
  { name: '上海', longitude: 121.4737 },
  { name: '杭州', longitude: 120.1536 },
  { name: '哈尔滨', longitude: 126.6424 },
  { name: '北京', longitude: 116.4074 },
  { name: '武汉', longitude: 114.3054 },
  { name: '西安', longitude: 108.9540 },
  { name: '成都', longitude: 104.0657 },
  { name: '昆明', longitude: 102.7123 },
  { name: '乌鲁木齐', longitude: 87.6177 },
  { name: '拉萨', longitude: 91.1172 },
];

console.log('═'.repeat(70));
console.log('  真太阳时计算准确性测试');
console.log('═'.repeat(70));
console.log('');
console.log('说明: 中国标准时间基于东经120°,各地真太阳时与北京时间有偏差');
console.log('公式: 真太阳时偏移(分钟) = (当地经度 - 120) × 4');
console.log('');
console.log('─'.repeat(70));

for (const city of CITIES) {
  const offset = calculateTrueSolarTimeOffset(city.longitude);
  const offsetStr = offset >= 0 ? `+${offset}` : `${offset}`;
  const hours = Math.abs(offset) >= 60 ? Math.floor(Math.abs(offset) / 60) : 0;
  const minutes = Math.abs(offset) % 60;
  const humanReadable = hours > 0
    ? `(${offset > 0 ? '快' : '慢'}${hours}小时${minutes > 0 ? minutes + '分钟' : ''})`
    : `(${offset > 0 ? '快' : '慢'}${Math.abs(offset)}分钟)`;

  console.log(`${city.name.padEnd(8)} | 经度: ${city.longitude.toFixed(2)}° | 偏移: ${offsetStr.padStart(4)}分钟 ${humanReadable}`);
}

console.log('');
console.log('─'.repeat(70));

// 示例:时辰边界影响演示
console.log('');
console.log('═'.repeat(70));
console.log('  示例:时辰边界影响演示');
console.log('═'.repeat(70));
console.log('');

const EXAMPLES = [
  { city: '乌鲁木齐', longitude: 87.6177, clockTime: '12:00', description: '钟表显示中午12点' },
  { city: '乌鲁木齐', longitude: 87.6177, clockTime: '23:30', description: '钟表显示晚上23:30' },
  { city: '北京', longitude: 116.4074, clockTime: '23:30', description: '钟表显示晚上23:30' },
  { city: '上海', longitude: 121.4737, clockTime: '23:30', description: '钟表显示晚上23:30' },
];

// 时辰对照表
const getShiChen = (hour) => {
  const shiChen = ['子', '丑', '丑', '寅', '寅', '卯', '卯', '辰', '辰', '巳', '巳', '午', '午', '未', '未', '申', '申', '酉', '酉', '戌', '戌', '亥', '亥', '子'];
  return shiChen[hour] + '时';
};

for (const example of EXAMPLES) {
  const offset = calculateTrueSolarTimeOffset(example.longitude);
  const [h, m] = example.clockTime.split(':').map(Number);
  let trueSolarMinute = m + offset;
  let trueSolarHour = h;

  while (trueSolarMinute >= 60) {
    trueSolarHour++;
    trueSolarMinute -= 60;
  }
  while (trueSolarMinute < 0) {
    trueSolarHour--;
    trueSolarMinute += 60;
  }
  while (trueSolarHour >= 24) {
    trueSolarHour -= 24;
  }
  while (trueSolarHour < 0) {
    trueSolarHour += 24;
  }

  const clockShiChen = getShiChen(h);
  const trueShiChen = getShiChen(trueSolarHour);

  const trueSolarTimeStr = `${String(trueSolarHour).padStart(2, '0')}:${String(Math.round(trueSolarMinute)).padStart(2, '0')}`;
  const shiChenChanged = clockShiChen !== trueShiChen ? '⚠️ 时辰变化!' : '';

  console.log(`📍 ${example.city} (东经${example.longitude.toFixed(1)}°)`);
  console.log(`   ${example.description}`);
  console.log(`   钟表时间: ${example.clockTime} (${clockShiChen}) → 真太阳时: ${trueSolarTimeStr} (${trueShiChen}) ${shiChenChanged}`);
  console.log('');
}

console.log('═'.repeat(70));
console.log('  关键发现');
console.log('═'.repeat(70));
console.log('');
console.log('1. 东部城市(如上海、哈尔滨)真太阳时比北京时间快');
console.log('2. 西部城市(如成都、乌鲁木齐)真太阳时比北京时间慢');
console.log('3. 乌鲁木齐比北京慢约2小时10分钟,时辰差异最大');
console.log('4. 子时边界(23:00-01:00)附近出生者,地点选择尤为重要');
console.log('');
console.log('═'.repeat(70));