|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import { |
|
|
CHINA_REGIONS, |
|
|
calculateTrueSolarTimeOffset, |
|
|
getLocationCoordinates, |
|
|
searchLocation, |
|
|
} from '../data/chinaCities.js'; |
|
|
|
|
|
|
|
|
const TEST_CASES = [ |
|
|
|
|
|
{ name: '上海', expectedLongitude: 121.47, expectedOffset: 6 }, |
|
|
{ name: '杭州', expectedLongitude: 120.15, expectedOffset: 1 }, |
|
|
{ name: '哈尔滨', expectedLongitude: 126.64, expectedOffset: 27 }, |
|
|
|
|
|
|
|
|
{ name: '北京', expectedLongitude: 116.41, expectedOffset: -14 }, |
|
|
{ name: '武汉', expectedLongitude: 114.31, expectedOffset: -23 }, |
|
|
{ name: '西安', expectedLongitude: 108.95, expectedOffset: -44 }, |
|
|
|
|
|
|
|
|
{ name: '成都', expectedLongitude: 104.07, expectedOffset: -64 }, |
|
|
{ name: '昆明', expectedLongitude: 102.71, expectedOffset: -69 }, |
|
|
{ name: '乌鲁木齐', expectedLongitude: 87.62, expectedOffset: -130 }, |
|
|
{ name: '拉萨', expectedLongitude: 91.12, expectedOffset: -116 }, |
|
|
]; |
|
|
|
|
|
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)); |
|
|
|
|
|
let passCount = 0; |
|
|
let failCount = 0; |
|
|
|
|
|
for (const testCase of TEST_CASES) { |
|
|
|
|
|
const results = searchLocation(testCase.name); |
|
|
const location = results[0]; |
|
|
|
|
|
if (!location) { |
|
|
console.log(`❌ ${testCase.name}: 未找到该城市`); |
|
|
failCount++; |
|
|
continue; |
|
|
} |
|
|
|
|
|
|
|
|
const actualOffset = calculateTrueSolarTimeOffset(location.longitude); |
|
|
const expectedOffset = testCase.expectedOffset; |
|
|
const longitudeDiff = Math.abs(location.longitude - testCase.expectedLongitude); |
|
|
const offsetDiff = Math.abs(actualOffset - expectedOffset); |
|
|
|
|
|
|
|
|
const isAccurate = offsetDiff <= 2; |
|
|
|
|
|
if (isAccurate) { |
|
|
console.log(`✅ ${testCase.name.padEnd(8)} | 经度: ${location.longitude.toFixed(2)}° | 偏移: ${actualOffset >= 0 ? '+' : ''}${actualOffset}分钟`); |
|
|
passCount++; |
|
|
} else { |
|
|
console.log(`❌ ${testCase.name.padEnd(8)} | 经度: ${location.longitude.toFixed(2)}° | 计算偏移: ${actualOffset}分钟 | 预期: ${expectedOffset}分钟`); |
|
|
failCount++; |
|
|
} |
|
|
} |
|
|
|
|
|
console.log(''); |
|
|
console.log('─'.repeat(70)); |
|
|
console.log(`测试结果: 通过 ${passCount}/${TEST_CASES.length}, 失败 ${failCount}/${TEST_CASES.length}`); |
|
|
console.log('─'.repeat(70)); |
|
|
|
|
|
|
|
|
console.log(''); |
|
|
console.log('═'.repeat(70)); |
|
|
console.log(' 示例:时辰边界影响演示'); |
|
|
console.log('═'.repeat(70)); |
|
|
console.log(''); |
|
|
|
|
|
const EXAMPLES = [ |
|
|
{ city: '乌鲁木齐', clockTime: '12:00', description: '钟表显示中午12点' }, |
|
|
{ city: '乌鲁木齐', clockTime: '23:30', description: '钟表显示晚上23:30' }, |
|
|
{ city: '北京', clockTime: '23:30', description: '钟表显示晚上23:30' }, |
|
|
{ city: '上海', clockTime: '23:30', description: '钟表显示晚上23:30' }, |
|
|
]; |
|
|
|
|
|
for (const example of EXAMPLES) { |
|
|
const results = searchLocation(example.city); |
|
|
const location = results[0]; |
|
|
if (!location) continue; |
|
|
|
|
|
const offset = calculateTrueSolarTimeOffset(location.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 getShiChen = (hour) => { |
|
|
const shiChen = ['子', '丑', '丑', '寅', '寅', '卯', '卯', '辰', '辰', '巳', '巳', '午', '午', '未', '未', '申', '申', '酉', '酉', '戌', '戌', '亥', '亥', '子']; |
|
|
return shiChen[hour] + '时'; |
|
|
}; |
|
|
|
|
|
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} (东经${location.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)); |
|
|
|