寻求JavaScript中适配RFC 3339时间的PHP strtotime()等效函数
替代PHP strtotime()解析RFC 3339时间的JavaScript方案
别担心,针对严格的RFC 3339格式时间(比如你举的2018-05-29T17:29:25+00Z),JavaScript其实有原生的可靠解决方案,完全不需要依赖第三方库(比如你试过的locutus,它的strtotime实现更多是模拟PHP处理各种松散格式,反而在标准格式上可能不如原生精准)。
下面是几种实用的方法:
1. 原生Date构造函数(最推荐)
ECMAScript规范早就支持直接解析RFC 3339格式的字符串,直接传给new Date()就能得到对应的Date对象,要拿到类似PHP strtotime()的时间戳(Unix时间),只需要调用getTime()或valueOf():
const rfc3339Time = '2018-05-29T17:29:25+00Z'; // 获取毫秒级时间戳(JavaScript默认是毫秒,PHP是秒) const msTimestamp = new Date(rfc3339Time).getTime(); // 转换成和PHP strtotime一致的秒级时间戳 const secTimestamp = Math.floor(msTimestamp / 1000); console.log(secTimestamp); // 输出和PHP strtotime("2018-05-29T17:29:25+00Z")一致的结果
这个方法在所有现代浏览器(Chrome、Firefox、Edge等)和Node.js环境中都能正常工作,完全不需要额外依赖。
2. 用专业日期库增强(可选)
如果你需要处理更多边缘情况,或者要对日期进行复杂操作,可以用成熟的日期库,比如luxon或date-fns,它们对RFC 3339的支持非常严谨:
示例:luxon
import { DateTime } from 'luxon'; const rfc3339Time = '2018-05-29T17:29:25+00Z'; const secTimestamp = DateTime.fromISO(rfc3339Time).toMillis() / 1000; console.log(secTimestamp);
示例:date-fns
import { parseISO } from 'date-fns'; const rfc3339Time = '2018-05-29T17:29:25+00Z'; const msTimestamp = parseISO(rfc3339Time).getTime(); const secTimestamp = Math.floor(msTimestamp / 1000); console.log(secTimestamp);
为什么locutus的strtotime可能不好用?
locutus的strtotime实现是尽可能模拟PHP的行为,PHP的strtotime能处理各种非标准的日期字符串,但这种“兼容一切”的设计反而可能在处理严格标准格式时出现偏差,而原生JavaScript的Date构造函数针对RFC 3339有专门的解析逻辑,反而更可靠。
内容的提问来源于stack exchange,提问作者ctrinh
相关产品推荐
相关产品推荐

