无法将毫秒级时间戳存入整数,如何将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
相关产品推荐
相关产品推荐

