我的数据库中有一个名为time
的字段。它包含UNIX时间戳。但是数据类型是一个字符串,而在php中,date函数需要一个整数。
所以我尝试将字符串解析为整数但值会改变。
$time = $value['time'];
echo "Time string is $time<br/>";
settype($time,'integer');
echo "time intenger is".$time."<br/>";
这是我得到的输出
时间字符串是1499327190163
时间整数是2147483647
我在这里做错了什么?或者有更好的方法将时间戳转换为日期吗?感谢
编辑:我刚刚阅读了关于settype的手册,它说&#34; int&#34;的最大值是PHP_INT_MAX。也许这可能是我的问题,是否可以改变这一点,或者在更改最大整数值时是否存在任何与安全相关的问题?
答案 0 :(得分:2)
这是因为整数的范围(上限)是:
2147483647
通俗地说,一个杯子不能盛水桶。
PHP的32位版本:
Integers can be from -2,147,483,648 to 2,147,483,647 (~ ± 2 billion)
PHP的64位版本:
Integers can be from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (~ ± 9 quintillion)
答案 1 :(得分:0)
1499327190163
似乎是毫秒中的UNIX时间戳,而PHP日期函数在秒中的时间戳中工作。 string与int问题是次要问题,因为该值将根据需要隐式转换为int。
更大的问题是该值超过32位整数的上限,但您需要对其进行数学运算才能将其从毫秒转换为秒。之一:
在数据库中执行;只是SELECT timestamp / 1000
。
使用bcdiv
在PHP中执行此操作:
$ts = bcdiv($timestamp, '1000', 0);
将其转换为float并将其划分为float;虽然准确度可能轻微受损。
剪掉字符串的最后3个字符,基本上具有相同的效果;它只是感觉正确 IMO。
现在你有一个时间戳PHP的日期函数可以使用。
答案 2 :(得分:-1)
Javascript使用13位数字进行unixtime,因此您需要将其转换为10位unixtime
<?php
$timeStr = "1499327190163";
$timeInt = (int) 1499327190163;
$timestamp = $timeInt / 1000;
$date = date("Y-m-d H:i:s", $timestamp);
echo $date;
$dateTime = new \DateTime();
$dateTime->setTimestamp($timestamp);
echo $dateTime->format("Y-m-d H:i:s");