工具函数-精准判断美东交易时间

// 令时判断

javascript 复制代码
// 美国夏令时判断(替换原有美冬令时判断)
export const isMeidonglingTime = (date) => !isSummerTime(date)

// 夏令时判断,非夏令时同时满足
export function isSummerTime(date = new Date()) {
    const year = date.getUTCFullYear()

    // 计算三月第二个周日2:00 AM ET(转换为UTC时间)
    let marchStart = new Date(Date.UTC(year, 2, 1))
    // 找到第一个周日
    while (marchStart.getUTCDay() !== 0) {
        marchStart.setUTCDate(marchStart.getUTCDate() + 1)
    }
    // 加7天得到第二个周日
    marchStart.setUTCDate(marchStart.getUTCDate() + 7)
    // 设置美东时间2:00 AM(考虑时区转换:ET在3月可能是UTC-5或UTC-4)
    marchStart.setUTCHours(7) // 2:00 AM ET = 7:00 UTC(夏令时开始前ET是UTC-5)

    // 计算十一月第一个周日2:00 AM ET(转换为UTC时间)
    let novemberEnd = new Date(Date.UTC(year, 10, 1))
    while (novemberEnd.getUTCDay() !== 0) {
        novemberEnd.setUTCDate(novemberEnd.getUTCDate() + 1)
    }
    // 设置美东时间2:00 AM(标准时间ET是UTC-5)
    novemberEnd.setUTCHours(7) // 2:00 AM ET = 7:00 UTC(夏令时结束后ET是UTC-5)

    // 转换为UTC时间进行比较
    const utcDate = date.getTime()
    return utcDate >= marchStart.getTime() && utcDate < novemberEnd.getTime()
}
javascript 复制代码
export const is16to04Time = () => {
    const now = new Date()
    const hours = String(now.getHours()).padStart(2, '0')
    const minutes = String(now.getMinutes()).padStart(2, '0')
    console.log('is16to04Time:', hours + minutes, (hours + minutes) * 1)
    if ((hours + minutes) * 1 >= 1600 && (hours + minutes) * 1 <= 2359) {
        return true
    } else if ((hours + minutes) * 1 >= 0 && (hours + minutes) * 1 <= 400) {
        return true
    } else {
        return false
    }
}

注意里面的数字:

>=1600,指代16:00;<=2359,指代23:59;

>= 0 等于:>=00:00;<=400等于:<=04:00

javascript 复制代码
export const is17to05Time = () => {
    const now = new Date()
    const hours = String(now.getHours()).padStart(2, '0')
    const minutes = String(now.getMinutes()).padStart(2, '0')
    console.log('is17to05Time:', hours + minutes, (hours + minutes) * 1)
    if ((hours + minutes) * 1 >= 1700 && (hours + minutes) * 1 <= 2359) {
        return true
    } else if ((hours + minutes) * 1 >= 0 && (hours + minutes) * 1 <= 500) {
        return true
    } else {
        return false
    }
}

注意里面的数字:

>=1700,指代17:00;<=2359,指代23:59;

>= 0 等于:>=00:00;<=500等于:<=05:00


附上本人调用场景:(可根据自己的业务场景调用)

javascript 复制代码
let timer = null
timer = setInterval(() => {
    // 判断交易状态
    if (isMeidonglingTime() && is17to05Time()) {
        // 17:00-05:00 交易中
    } else if (!isMeidonglingTime() && is16to04Time()) {
        // 16:00-04:00 交易中
    } else {
        // 其他时间 非交易时间
    }
}, 1000)

记得在组件卸载时关闭定时器:
onBeforeUnmount(()=> {clearInterval(timer)})

需要的朋友自取,如果有用的话帮忙点个关注哈!

相关推荐
寒水馨14 分钟前
macOS下载、安装electron-v43.2.0(附安装包electron-v43.2.0-darwin-arm64.zip)
javascript·macos·electron·node.js·跨平台·桌面应用开发·开源框架
不好听61335 分钟前
React 父子组件通信:从 Todo 应用理解单向数据流
前端·react.js
光影少年39 分钟前
RN 路由栈管理、页面销毁、返回拦截
javascript·react native·react.js
_lucas43 分钟前
做了一个glsl在线调试工具
前端·javascript·three.js
To_OC9 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
腻害兔9 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
不好听6139 小时前
从一行 JSX 到屏幕像素:前端开发者必须懂的浏览器渲染管线
前端
恒拓高科WorkPlus9 小时前
企业级内网即时通讯建设模型:BeeWorks内网IM四层架构
前端
前端小李子10 小时前
前端环境变量裸奔?我用 EnvShield 给它穿了件防弹衣
前端
youtootech10 小时前
HarmonyOS《柚兔学伴》项目实战25-我的页面、Web 嵌入与项目总结
前端·华为·harmonyos