|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)); |
|
|
|