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
相关产品推荐
相关产品推荐

