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

无法将毫秒级时间戳存入整数,如何将CQL查询的时间戳对象转为整数?

解决Cassandra返回的毫秒时间戳对象转整数问题

看起来你遇到的核心问题是:从CQL查询返回的datetime字段是对象类型(比如Cassandra驱动返回的Cassandra\VarInt或类似数值对象),虽然直接echo能输出正确的数值,但没法直接做除法运算。下面给你几种可靠的解决方法:

方法1:强制类型转换(最简单)

既然echo $mil能输出正确的数值,说明这个对象支持__toString()方法,我们可以直接强制转成整数,或者先转字符串再转整数(更保险):

foreach ($result as $row) {
    // 直接将对象转成整数
    $mil = (int)$row['datetime'];
    // 或者先转字符串再转整数,避免特殊对象的转换问题
    // $mil = (int)(string)$row['datetime'];
    
    $seconds = $mil / 1000;
    echo date("d/m/Y H:i:s", $seconds);
}

方法2:调用对象的原生方法(更严谨)

如果是Cassandra官方驱动返回的数值对象(比如VarInt),它通常会提供获取原始值的方法,比如value():

foreach ($result as $row) {
    // 调用对象方法获取内部的数值
    $mil = $row['datetime']->value();
    $seconds = $mil / 1000;
    echo date("d/m/Y H:i:s", $seconds);
}

你可以先执行var_dump($row['datetime'])查看对象结构,确认具体的方法名。

方法3:32位PHP系统的特殊处理(兼容老环境)

如果你的服务器是32位PHP,13位的毫秒时间戳会超过PHP_INT_MAX(32位系统最大值为2147483647),直接转整数会溢出。这时候可以用字符串处理或高精度除法:

foreach ($result as $row) {
    $mil_str = (string)$row['datetime'];
    // 用bcdiv做高精度除法,保留3位小数
    $seconds = bcdiv($mil_str, 1000, 3);
    echo date("d/m/Y H:i:s", (float)$seconds);
}

额外技巧:直接在CQL查询中转换

如果你不想在PHP里处理,也可以在CQL查询时直接把时间戳转成格式化字符串,比如:

SELECT id, dateOf(datetime) AS formatted_datetime FROM your_table;

不过这种方式返回的是Cassandra默认的日期格式,灵活性不如在PHP里自定义格式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:18:07