import { dataService } from './dataService.js' /** * 自动刷新服务 * 每天美东时间早上5点自动从数据库刷新数据 */ class AutoRefreshService { constructor() { this.timerId = null this.targetHour = 5 // 美东早上5点 this.isRunning = false } /** * 计算下一次美东早上5点的时间 */ getNextRefreshTime() { const now = new Date() // 获取美东时区的当前时间 const etOptions = { timeZone: 'America/New_York', hour12: false } const etTimeString = now.toLocaleString('en-US', etOptions) const etDate = new Date(etTimeString) // 设置为美东早上5点 const nextRefresh = new Date(etDate) nextRefresh.setHours(this.targetHour, 0, 0, 0) // 如果已经过了今天的5点,设置为明天 if (etDate.getTime() >= nextRefresh.getTime()) { nextRefresh.setDate(nextRefresh.getDate() + 1) } // 转换回本地时区 const etTimestamp = nextRefresh.getTime() const etOffset = this.getETOffset(nextRefresh) const localOffset = now.getTimezoneOffset() * 60 * 1000 const localTimestamp = etTimestamp - etOffset + localOffset return new Date(localTimestamp) } /** * 获取美东时区的偏移量(毫秒) */ getETOffset(date) { const etString = date.toLocaleString('en-US', { timeZone: 'America/New_York', timeZoneName: 'short' }) // EST is UTC-5, EDT is UTC-4 const isDST = etString.includes('EDT') return isDST ? -4 * 60 * 60 * 1000 : -5 * 60 * 60 * 1000 } /** * 执行刷新 */ async refresh() { console.log('[AutoRefresh] Refreshing data at', new Date().toLocaleString()) try { await dataService.load(true) console.log('[AutoRefresh] Data refreshed successfully') } catch (error) { console.error('[AutoRefresh] Failed to refresh data:', error) } } /** * 调度下一次刷新 */ scheduleNext() { // 清除现有的定时器 if (this.timerId) { clearTimeout(this.timerId) this.timerId = null } const nextRefresh = this.getNextRefreshTime() const now = new Date() const delay = nextRefresh.getTime() - now.getTime() console.log('[AutoRefresh] Next refresh scheduled at:', nextRefresh.toLocaleString()) console.log('[AutoRefresh] Time until next refresh:', Math.round(delay / 1000 / 60), 'minutes') this.timerId = setTimeout(async () => { await this.refresh() this.scheduleNext() // 刷新后调度下一次 }, delay) } /** * 启动自动刷新 */ start() { if (this.isRunning) { console.log('[AutoRefresh] Already running') return } console.log('[AutoRefresh] Starting auto-refresh service') this.isRunning = true this.scheduleNext() } /** * 停止自动刷新 */ stop() { console.log('[AutoRefresh] Stopping auto-refresh service') if (this.timerId) { clearTimeout(this.timerId) this.timerId = null } this.isRunning = false } /** * 手动触发刷新(不影响定时调度) */ async triggerManualRefresh() { console.log('[AutoRefresh] Manual refresh triggered') await this.refresh() } } // 创建单例 export const autoRefreshService = new AutoRefreshService()