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

React Native服务器返回时间格式转换求助:Date与moment解析失败

React Native 时间格式转换:Dec 1, 2021 12:07:32 PM → YYYY-MM-DD HH:mm:ss

问题原因

React Native 内置的 Date 构造函数和未指定解析格式的 Moment.js,对这种带英文月份缩写、AM/PM标识的非标准日期字符串解析兼容性较差,导致返回无效日期。

解决方案

1. Moment.js 显式指定解析格式(推荐)

直接传入字符串时,Moment 无法自动识别该格式,需手动匹配解析模板:

import moment from 'moment';

const rawTime = 'Dec 1, 2021 12:07:32 PM';
const formattedTime = moment(rawTime, 'MMM D, YYYY hh:mm:ss A').format('YYYY-MM-DD HH:mm:ss');
// 输出:2021-12-01 12:07:32

模板参数说明:

  • MMM:英文月份缩写(如 Dec)
  • D:1-2位日期(如 1)
  • YYYY:4位年份
  • hh:12小时制小时(01-12)
  • mm:分钟
  • ss:秒
  • A:AM/PM 标识

2. 原生 JavaScript 手动解析(无依赖)

如果不想引入第三方库,可手动拆分字符串构造 Date 对象:

const rawTime = 'Dec 1, 2021 12:07:32 PM';

// 拆分日期时间各部分
const [monthStr, dayStr, year, time, period] = rawTime.split(/[ ,]/);
const day = parseInt(dayStr, 10);

// 月份映射(JS Date 月份从0开始)
const monthMap = {
  Jan:0, Feb:1, Mar:2, Apr:3, May:4, Jun:5,
  Jul:6, Aug:7, Sep:8, Oct:9, Nov:10, Dec:11
};
const month = monthMap[monthStr];

// 处理12小时制转24小时制
const [h, m, s] = time.split(':').map(Number);
const hours = period === 'PM' ? (h === 12 ? 12 : h + 12) : (h === 12 ? 0 : h);

// 构造Date并格式化输出
const date = new Date(year, month, day, hours, m, s);
const formattedTime = `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2,'0')}-${String(date.getDate()).padStart(2,'0')} ${String(date.getHours()).padStart(2,'0')}:${String(date.getMinutes()).padStart(2,'0')}:${String(date.getSeconds()).padStart(2,'0')}`;
// 输出:2021-12-01 12:07:32

注意事项

  • React Native 的 Hermes 引擎对非标准日期字符串解析容错性低于浏览器,显式指定格式是更稳定的方案。
  • 使用 Moment.js 需先安装依赖:npm install moment 或 yarn add moment

内容的提问来源于stack exchange,提问作者lee wj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 11:38:42