在PHP中验证java时间戳
我有一个基于php的API,它接受来自Android设备(read-Java)的上传。数据采用JSON格式,其中一个字段是java时间戳,例如在PHP中验证java时间戳,php,regex,numbers,Php,Regex,Numbers,我有一个基于php的API,它接受来自Android设备(read-Java)的上传。数据采用JSON格式,其中一个字段是java时间戳,例如1421100231554。PHP代码正在使用以下(简化)代码(相当简单地)检查此时间戳的有效性: 这个check\u num函数是从许多不同的地方调用的 后来,使用此代码使用此时间戳将数据插入数据库(这一部分与本问题的目的几乎无关) 这对我来说效果很好——直到我们将主机从Fedora4(不问)迁移到最新的CentOS。现在此代码停止工作,因为preg_m
1421100231554
。PHP代码正在使用以下(简化)代码(相当简单地)检查此时间戳的有效性:
这个check\u num
函数是从许多不同的地方调用的
后来,使用此代码使用此时间戳将数据插入数据库(这一部分与本问题的目的几乎无关)
这对我来说效果很好——直到我们将主机从Fedora4(不问)迁移到最新的CentOS。现在此代码停止工作,因为preg_match('/^\d+$/',$data['timestamp'])
正在返回0
。我开始深入研究,结果发现PHP正在将13位数字转换成科学符号,即1.42110023155E+12
。这显然使模式匹配器失效
时间戳以数字而不是字符串的形式出现,也就是说,相关的JSON片段是:
[
{
"timestamp":1421100231554,
"customer":100274,
"type":"warehouse",
"items":[...]
}
]
我对发送数据的Android应用程序没有任何控制权,因此我必须进行的任何调整都必须在PHP的服务器端进行
如何修复PHP代码以使其再次正常工作?对不起,您最后的评论…:) 然后试试看
$i = gmp_init( $number );
$timestamp = gmp_strval( $i );
关于这一点,有两个学派: 如果使用选项中设置的
JSON\u BIGINT\u AS\u STRING
标志调用,则它应将任何太大而无法表示为int的整数作为字符串传回。这应保持精度:
$myJson = '{"time":71055011577700000000}'; // too big to fit into 64-bit int
$myobj = json_decode($myJson,false,512,JSON_BIGINT_AS_STRING);
var_dump($myObj);
object(stdClass)#1 (1) {
["time"]=>
string(20) "71055011577700000000"
}
另一种观点是,不应该对数值使用正则表达式来确定它们是否在指定的范围内。用数学。。。关于数字。革命,我知道:
if ($data['timestamp'] > 1e14) {
die('more than 13 digits in your int!');
} elseif ($data['timestamp'] < 1) {
die('your int is too small');
}
if($data['timestamp']>1e14){
die('int中超过13位!');
}elseif($data['timestamp']<1){
die('您的int太小');
}
if(is_int($data['timestamp'])
应该这样做。@安非他命机器它不一样-它不检查13位数字。正如我所说的,我在很多地方都调用了这个函数,在那里我指定了数字的预期长度。他没有ctrl键json\u decode($jsonstring,false,512,json\u BIGINT\u As\u STRING)
也会这样做。我得到错误PHP警告:gmp\u strval():无法将变量转换为GMP-输入错误-在第1行
@安非他明这就成功了!我更新了我的代码,但安非他明解决方案似乎是一个很好的标志,json\u decode
做到了。至于用数学来检查数字,是的,这是正确的方法,但是我正在使用其他人的代码,我不想开始修复其他有效的东西;考虑到我们正在从PHP5.1迁移到PHP5.4,我已经有足够多的问题了——旧服务器已经好几年没有更新了。
$myJson = '{"time":71055011577700000000}'; // too big to fit into 64-bit int
$myobj = json_decode($myJson,false,512,JSON_BIGINT_AS_STRING);
var_dump($myObj);
object(stdClass)#1 (1) {
["time"]=>
string(20) "71055011577700000000"
}
if ($data['timestamp'] > 1e14) {
die('more than 13 digits in your int!');
} elseif ($data['timestamp'] < 1) {
die('your int is too small');
}