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

Flutter中展示MySQL存储时间相对时长?解决类型转换错误

解决Flutter中时间戳类型转换错误的方案

错误根源

PHP接口返回的发布时间戳(从MySQL获取的UNIX时间戳)是字符串格式,但Flutter代码中直接将其当作int类型处理,触发type 'String' is not a subtype of type 'int'类型不匹配错误。

具体修复步骤

1. 调整PHP接口返回格式(推荐)

确保PHP返回的时间戳为数字类型(而非字符串):

  • 如果MySQL存储的是datetime类型,转成UNIX时间戳时直接返回数字:
    // 正确写法:返回int类型时间戳
    $data['publish_time'] = strtotime($row['publish_time']);
    
  • 避免使用strval()等方法将时间戳转为字符串返回,否则会导致Flutter端类型不兼容。

2. Flutter端手动处理类型转换

如果PHP接口无法修改,在Flutter解析数据时强制将字符串转为int:

  • 直接解析JSON时:
    // 错误写法:直接赋值给int变量
    // int publishTime = json['publish_time'];
    // 正确写法:先转字符串再解析为int
    int publishTime = int.parse(json['publish_time'].toString());
    
  • 使用实体类(如json_serializable)时,在序列化方法中处理转换:
    class Post {
      final int publishTime;
      Post({required this.publishTime});
    
      factory Post.fromJson(Map<String, dynamic> json) {
        return Post(
          publishTime: int.parse(json['publish_time'].toString()),
        );
      }
    }
    

3. 相对时间计算的适配

注意时间戳的单位(秒级/毫秒级):

  • 若MySQL存的是秒级时间戳,需乘以1000转为Flutter兼容的毫秒级:
    DateTime publishDateTime = DateTime.fromMillisecondsSinceEpoch(publishTime * 1000);
    Duration timeDiff = DateTime.now().difference(publishDateTime);
    
    // 计算相对时长示例
    String getRelativeTime(Duration diff) {
      if (diff.inMinutes < 1) return '刚刚';
      if (diff.inHours < 1) return '${diff.inMinutes}分钟前';
      if (diff.inDays < 1) return '${diff.inHours}小时前';
      return '${diff.inDays}天前';
    }
    

4. 异常处理

添加解析失败的兜底逻辑,避免崩溃:

int? parsePublishTime(dynamic value) {
  try {
    return int.parse(value.toString());
  } catch (e) {
    // 解析失败时返回当前时间戳(秒级)
    return DateTime.now().millisecondsSinceEpoch ~/ 1000;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:54:07