Javascript/JQuery客户端考虑时区的日期比对实现(EST转换)
实现方案
你现有代码的核心问题有两个:
- 直接用
new Date($("#START_DATE").val())会把输入的EST时间字符串按用户本地时区解析,得到的时间戳完全错误 - 不需要专门把当前时间转成EST,只要把选中的EST时间正确转成绝对时间戳,直接和当前时间戳比对即可,时间戳是全球统一的,和用户所在时区无关
完整修改后的JS代码(原生JS,无需第三方库,自动兼容夏令时)
// 工具方法:将EST时区的时间字符串转为正确的时间戳 function parseESTStringToTimestamp(estTimeStr) { // 适配常见的时间格式:YYYY-MM-DD HH:mm、YYYY/MM/DD HH:mm等 const [datePart, timePart] = estTimeStr.split(/\s+/); const [year, month, day] = datePart.split(/[-/]/).map(Number); const [hour, minute] = timePart ? timePart.split(':').map(Number) : [0, 0]; // 用Intl.DateTimeFormat拿到EST时区对应时间的毫秒数 const estDate = new Date(year, month - 1, day, hour, minute); const utcDate = new Date(estDate.toLocaleString('en-US', { timeZone: 'America/New_York' })); const offset = estDate.getTime() - utcDate.getTime(); return estDate.getTime() + offset; } // 业务校验逻辑 const startDateStr = $("#START_DATE").val().trim(); const startDateTimeStamp = parseESTStringToTimestamp(startDateStr); const currentTimeStamp = Date.now(); if (startDateTimeStamp < currentTimeStamp) { alert("StartDateTime should be greater than current EST DateTime"); }
简化版实现(不需要兼容夏令时,固定按EST=UTC-5计算)
如果你的业务明确不需要考虑夏令时(EDT),可以用更简单的写法:
const startDateStr = $("#START_DATE").val().trim(); // 把输入的EST时间当成UTC时间解析,再加5小时的偏移,得到正确的UTC时间戳 const [datePart, timePart] = startDateStr.split(/\s+/); const startDateTimeStamp = new Date(`${datePart}T${timePart || '00:00'}Z`).getTime() + 5 * 3600 * 1000; const currentTimeStamp = Date.now(); if (startDateTimeStamp < currentTimeStamp) { alert("StartDateTime should be greater than current EST DateTime"); }
额外优化建议
如果你的DateTimePicker组件支持配置返回带时区的ISO时间字符串(比如2024-05-20T12:00:00-05:00),可以直接用new Date(isoStr)解析,不需要额外写转换逻辑,校验代码可以简化为:
const startDate = new Date($("#START_DATE").val()); if (startDate.getTime() < Date.now()) { alert("StartDateTime should be greater than current EST DateTime"); }
页面部分的cshtml代码不需要修改,只要保证DateTimePicker选中的值是正确的EST时间字符串即可。
内容的提问来源于stack exchange,提问作者vmb
相关产品推荐
相关产品推荐

