最近在做一個智能家居項目的后台,需要實時上傳用戶對智能設備的配置信息到服務器,以便實現同步,因此對於時間的精確度要求比較高,最開始直接是用php的time()函數來獲取時間戳,獲取的時間精確到秒級別,如果客戶端同時操作的話還是有可能產生沖突,因此建議將時間戳精度提高到毫秒級別,但是在php沒有自帶的函數能獲取毫秒時間戳,但提供了一個microtime()函數,如果調用時不帶可選參數,本函數以 "msec sec" 的格式返回一個字符串,其中 sec 是自 Unix 紀元(0:00:00 January 1, 1970 GMT)起到現在的秒數,msec 是微秒部分。字符串的兩部分都是以秒為單位返回的。
microtime()函數的詳細說明,可以到w3chool上面看看《PHP microtime() 函數》。
<?php
echo microtime();
//輸出結果是
//0.25139300 1138197510
注意了,它的結果是分兩部分的,也就是前半部分是毫秒(但是單位是秒),后半部分是秒。
現在,我們依據這個做下修改,如下:
<?php
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
這樣就可以了,$msectime就是當前的毫秒數!可以將這兩行封裝成一個函數方便使用。
<?php
//返回當前的毫秒時間戳
function msectime() {
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
}
注意:sprintf('%.0f', $num) 是輸出不含小數部分的浮點數
事情還沒有結束,我把時間戳改成毫秒級別后,再次更新數據庫數據時,卻提示超出范圍,原來之前我在數據庫中是用int型來存儲time()函數獲取的秒級別的時間戳,存儲范圍是夠的,改成毫秒級別的,就得改成BIGINT類型了。