Firefox日期格式无效:Rails服务端与AngularJS客户端适配问题
解决AngularJS中Firefox解析Rails返回UTC日期显示“无效日期”的问题
这个问题我做项目时也碰到过,核心原因是不同浏览器对非标准日期字符串的解析规则不一致:Chrome能正常识别2018-05-09 09:46:33 UTC这种格式,但Firefox对这种带空格和UTC后缀的非ISO标准格式支持不佳,所以会返回“无效日期”。
下面给你几个靠谱的解决方案,按推荐优先级排序:
方案1:直接用moment解析原始字符串(最推荐)
既然你已经在使用moment.js,完全不需要先转成原生Date对象——moment的日期解析兼容性比原生好太多,能直接处理这种格式的UTC字符串。修改代码如下:
getDateTimeOriginal: => if @metadata? and @metadata.date_time_original? moment(@metadata.date_time_original).format('DD-MMM-YYYY h:mm A')
moment内部会自动识别UTC时区,然后转换为本地时间格式输出,跨浏览器表现一致。
方案2:将日期字符串转为ISO标准格式再解析
如果一定要保留原生Date的使用,可以先把Rails返回的日期字符串改成Firefox能识别的ISO 8601格式,只需要把空格替换成T:
getDateTimeOriginal: => if @metadata? and @metadata.date_time_original? const formattedDateStr = @metadata.date_time_original.replace(' ', 'T'); const dateTime = new Date(formattedDateStr); moment(dateTime).format('DD-MMM-YYYY h:mm A')
转换后的字符串2018-05-09T09:46:33 UTC符合ISO标准,所有现代浏览器都能正确解析。
方案3:显式指定UTC时区解析(更严谨)
如果担心时区解析有歧义,可以用moment.utc()明确把输入字符串当成UTC时间解析,再转成本地时间输出:
getDateTimeOriginal: => if @metadata? and @metadata.date_time_original? moment.utc(@metadata.date_time_original).local().format('DD-MMM-YYYY h:mm A')
这种方式完全规避了浏览器原生解析的差异,结果最可控,适合对时间精度要求高的场景。
内容的提问来源于stack exchange,提问作者user9569059
相关产品推荐
相关产品推荐

