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

React Native使用moment.js时AM/PM时间格式显示异常问题

React Native中moment格式化时间AM/PM显示异常排查

问题现象

使用moment.js生成带AM/PM标识的时间格式时,开始时间与结束时间格式化后均显示为AM,预期结束时间应正确显示为PM。
时间显示异常效果截图

相关业务代码

return (
  <ScrollView style={[GlobalStyle.CustomScrollView]}>
    <HeaderBar3/>
    <Text style={[GlobalStyle.EventTitle]}> Event Details</Text>
    <View style={[GlobalStyle.EventDetailView]}>
      <Image style={[GlobalStyle.EventDetailImage]} source={{uri: eventData.main_image}} resizeMode="contain"/>
      <Text style={[GlobalStyle.EventSubtitle]}>Date:</Text>
      <Text style={[GlobalStyle.EventDate]}>{moment(eventData.starts_on).format('DD MMMM YYYY')}</Text>
      <Text style={[GlobalStyle.EventTime]}>{moment(eventData.starts_on).format('hh:mm A')} {'-'} {moment(eventData.ends_on).format('hh:mm A')}</Text>

接口返回数据参考

接口返回时间字段截图

根因定位

异常本质是时区解析错误:接口返回的时间为UTC标准时间,直接调用moment(timeStr)解析时,moment会默认将时间转换为设备本地时区做计算,如果本地时区偏移后刚好把结束时间的小时数折算到上午区间,就会错误显示AM。

修复方案

  • 若业务要求直接展示接口返回的标准时间,不做本地时区转换,直接使用moment.utc()方法按UTC时区解析时间,跳过本地时区自动转换即可:
<Text style={[GlobalStyle.EventTime]}>
  {moment.utc(eventData.starts_on).format('hh:mm A')} 
  {'-'} 
  {moment.utc(eventData.ends_on).format('hh:mm A')}
</Text>
  • 若业务要求按本地时区展示时间,可以在解析时显式指定时间字符串的格式,开启严格解析模式,避免moment自动识别格式时出现误判:
// 按接口实际返回的时间格式替换第二个参数的格式串
moment(eventData.ends_on, 'YYYY-MM-DD HH:mm:ss', true).format('hh:mm A')
  • 排查阶段可先加日志确认解析结果:执行console.log(moment(eventData.ends_on).hour())查看解析后的小时值,确认是否和接口返回的小时值一致,快速定位是否为解析环节错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:51:34