js 时间的转换

在实际工作中,我们经常会使用到时间和时间戳的转换。一直以来,我都以为这个转换没啥难度,就是个new Date 的事儿。可如今移动端兴旺的时代,我们考滤的事儿还是很多的。

假如说,我们有这样的一个时间 '2025-08-06' ,那么,如果在低版本的苹果系统中,是会转换换败的,直接出来一个 Invalid Date。那么,此时,你又必须得把前面有 零的给去掉,这样才能转换成功。但这样即很麻烦。

所以,有一个最佳的解决方案就是自己封装一个函数,让它兼容所有的设备。代如如下

javascript 复制代码
/**
 * 将 YYYY-MM-DD HH:mm:ss 格式的字符串转换为时间戳(本地时间)
 * 兼容:
 * 1. 年月日部分:2025-05-08 / 2025-5-8 / 2025-5-08 等
 * 2. 时间部分:09:02:05 / 9:2:5 / 9:02:5 等
 * 3. 可选时间部分:仅传 YYYY-MM-DD 也可正常解析
 * @param {string} dateTimeStr - 日期时间字符串,如 '2025-05-08 09:02:05' 或 '2025-5-8 9:2:5'
 * @returns {number} 时间戳(毫秒),解析失败返回 NaN
 */
function dateTimeStrToTimestamp(dateTimeStr) {
  // 拆分日期和时间部分(按空格分割,兼容多个空格的情况)
  const [datePart, timePart = '00:00:00'] = dateTimeStr.trim().split(/\s+/);

  // 解析日期部分
  const dateParts = datePart.split('-');
  if (dateParts.length !== 3) return NaN;
  const year = parseInt(dateParts[0], 10);
  const month = parseInt(dateParts[1], 10) - 1; // 月份从 0 开始
  const day = parseInt(dateParts[2], 10);

  // 解析时间部分
  const timeParts = timePart.split(':');
  // 补全时分秒(若只传 HH 或 HH:mm,默认后续为 0)
  const hour = parseInt(timeParts[0] || 0, 10);
  const minute = parseInt(timeParts[1] || 0, 10);
  const second = parseInt(timeParts[2] || 0, 10);

  // 校验时间部分的合法性
  if (hour < 0 || hour > 23 || minute < 0 || minute > 59 || second < 0 || second > 59) {
    return NaN;
  }

  // 构造 Date 对象
  const date = new Date(year, month, day, hour, minute, second);

  // 校验日期部分的有效性(防止无效日期,如 2025-13-01、2025-02-30)
  if (
    date.getFullYear() !== year ||
    date.getMonth() !== month ||
    date.getDate() !== day ||
    date.getHours() !== hour || // 额外校验小时(防止跨天等异常)
    date.getMinutes() !== minute
  ) {
    return NaN;
  }

  return date.getTime();
}
相关推荐
Ai-_Man2 分钟前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
raindayinrain10 分钟前
c++设计模式
开发语言·c++·设计模式
hiahiahia12319 分钟前
Streaming Model Output
开发语言·前端
paopaokaka_luck19 分钟前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
栀椩29 分钟前
Electron 内嵌页面跨域问题(CORS/PNA)解决全记录
前端·javascript·electron
asaotomo35 分钟前
截图识题、AI 讲解、笔记沉淀:Chrome 扩展体验
前端·chrome·笔记
前端架构师-老李37 分钟前
HTML与CSS基础第五课—HTML的空格、换行、横线相关知识
前端·css·html
SEO_juper38 分钟前
Chrome 扩展一键查看当前页面 SEO 信息:不用切页面,点一下全出来
前端·javascript·chrome
Highcharts.js41 分钟前
CSUN 2026|Highcharts无障碍数据与AI分享
javascript·人工智能·数据分析·highcharts·图表开发
Nymph_Zhu44 分钟前
vue3+element-plus 文件上传
前端·typescript·vue3·element-plus