2017-07-06 58 views
0

我的数据库中有一个名为time的字段。它包含UNIX时间戳。然而,数据类型是一个字符串,在PHP中日期函数需要一个整数。Settype整数更改php中的值

所以我试图解析字符串为整数,但值的变化。

$time = $value['time']; 
    echo "Time string is $time<br/>"; 

    settype($time,'integer'); 
    echo "time intenger is".$time."<br/>"; 

这是输出我得到

时间字符串为1499327190163

时间intenger is2147483647

我到底做错了什么?或者有更好的方法将时间戳转换为日期吗?谢谢

编辑:我刚刚读了关于settype的手册,它说“int”的最大值是PHP_INT_MAX。也许这可能是我的问题,是否可以改变这个问题,或者在改变最大整数值时是否有任何安全相关问题?

+0

据我所知,UNIX时间戳仅有10位。你有13位数,我认为你需要先将它分为1000 –

+0

@DollyAswin时间戳是使用javascript生成的。 Dolly建议使用 –

+0

,请注意,时间戳可能会以秒或毫秒为单位,具体取决于语言/设置。此外,你的功能支持浮动?他们可以有更大的“整数”值 – Kaddath

回答

2

这是因为整数的范围(上限值)为:

2147483647 

在外行而言,杯不能容纳桶的水。

32位构建PHP的:

Integers can be from -2,147,483,648 to 2,147,483,647 (~ ± 2 billion) 

64位构建PHP的:

Integers can be from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (~ ± 9 quintillion) 

Check this answer

+0

我假设这个问题不会发生在64位版本的PHP? –

0

1499327190163似乎是在一个UNIX时间戳毫秒,wh ereas PHP日期函数在时间戳中工作。字符串与整数问题是次要的,因为该值将根据需要隐式转换为int。

更大的问题是,该值超过了32位整数的上限,但您需要对其进行数学运算才能将其从毫秒变为秒。或者:

  1. 在数据库中执行此操作;只是SELECT timestamp/1000

  2. 使用bcdiv做在PHP:

    $ts = bcdiv($timestamp, '1000', 0); 
    
  3. 将其转换为浮动,并把它作为浮动;尽管准确性可能受到轻微影响。

  4. 只修剪掉字符串的最后3个字符,它基本上具有相同的效果;它只是不觉得正确的国际海事组织。

现在你有一个时间戳PHP的日期函数可以使用。

+0

时间戳是在JavaScript中生成的,只是一个简短的问题。我应该在毫秒级进行分割还是强制javascript在秒内生成时间戳 –

+0

数据库应该将时间戳存储在本机的“TIMESTAMP”或“DATETIME”列中,然后在PHP和数据库之间不会出现此问题所有。那么它只取决于你如何定义你的REST接口,你是否想要以秒,毫秒或实际上一些ISO字符串表示来接受时间标准化。做出这个决定*语言中立*,而不是基于什么语言喜欢什么表示。 – deceze

-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"); 
+0

OP的问题在于它们的整数溢出...... – deceze