You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中两类日期字符串类型识别及格式转换方法咨询

最优实现方案

1. 低兼容要求的极简原生实现(推荐)

利用ES2022新增的时区偏移格式化参数,仅需几行代码即可完成转换,不需要手动拆分字符串和正则匹配:

function convertDate(inputStr) {
  const date = new Date(inputStr);
  return date.toLocaleString('sv-SE', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    timeZoneName: 'longOffset'
  }).replace(' ', 'T').replace('GMT', '');
}

// 测试验证
const input = 'Fri Sep 17 2021 11:50:59 GMT-0400 (Eastern Daylight Time)';
console.log(convertDate(input) === '2021-09-17T11:50:59-04:00'); // 输出 true

sv-SE地区的日期格式默认为YYYY-MM-DD,符合ISO格式要求,longOffset参数会自动生成GMT±hh:mm格式的时区偏移,简单替换字符即可得到目标格式。

2. 全兼容原生实现

如果需要兼容IE、Node.js 16以下等低版本运行环境,可以通过日期内置方法直接计算,完全不需要正则:

function convertDate(inputStr) {
  const pad = (num) => String(num).padStart(2, '0');
  const date = new Date(inputStr);
  // 计算时区偏移
  const tzOffset = -date.getTimezoneOffset();
  const tzSign = tzOffset >= 0 ? '+' : '-';
  const tzHour = pad(Math.floor(Math.abs(tzOffset) / 60));
  const tzMinute = pad(Math.abs(tzOffset) % 60);
  
  return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}${tzSign}${tzHour}:${tzMinute}`;
}

3. 依赖库实现(稳定性最高)

如果项目允许引入第三方依赖,使用日期库可以避免不同浏览器对原生日期解析的兼容性差异,代码最简洁:

day.js 示例

import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';

dayjs.extend(utc);
dayjs.extend(timezone);

const input = 'Fri Sep 17 2021 11:50:59 GMT-0400 (Eastern Daylight Time)';
const output = dayjs(input).format('YYYY-MM-DDTHH:mm:ssZ'); // 直接得到目标格式

内容的提问来源于stack exchange,提问作者Dave Stein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:24:01