2017-07-06 59 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