我正在使用一個 API,它給了我兩個時間值來描述它的執行,但格式不同。例如:
'created_at' => '2022-06-24T15:04:37.000000Z',
'processed_at' => '2022-06-24 15:05:15',
我正在運行代碼:
$created = "2022-06-24T15:04:37.000000Z";
$processed = "2022-06-24 15:05:15";
$createdtime = strtotime($created);
$processedtime = strtotime($processed);
$diff = $processedtime - $createdtime;
echo "Created: $created Processed: $processed createdtime: $createdtime processedtime: $processedtime Diff: $diff<br/>\n";
在兩個不同的服務器上,測驗如何找到這兩個時間之間的秒差。服務器上的一個它給了我結果:
Created: 2022-06-24T15:04:37.000000Z Processed: 2022-06-24 15:05:15 createdtime: 1656083077 processedtime: 1656083115 Diff: 38
在另一臺服務器上,它說:
Created: 2022-06-24T15:04:37.000000Z Processed: 2022-06-24 15:05:15 createdtime: 1656083077 processedtime: 1656097515 Diff: 14438
我假設這是一個時區問題。14400 秒=10 小時。“真正的”答案應該是 38,因為這是 API 在現實生活中處理請求所花費的時間。是否有任何代碼可以用來在兩臺服務器上獲得一致的 38 秒結果?
uj5u.com熱心網友回復:
processed_at不包含時區,因此 PHP 使用默認配置的任何內容。看起來時區processed_at應該是UTC,所以我只是強制它。您可以Z在字串的末尾添加一個:
$processedtime = strtotime($processed . ' Z');
或者,更正確地說,當字串中沒有可用的時區時,告訴 PHP 使用 UTC:
$processedtime = (new DateTime($processed, new DateTimeZone('UTC')))->format('U');
[更新]
有沒有辦法檢查字串是否有空白 TZ?
是的,但是只使用 DateTime 類的默認機制會更容易。例如,如果您這樣做:
$timestamp1 = new DateTime($string1, new DateTimeZone('UTC'));
然后,僅當字串未明確包含時區時才會應用此默認時區。但如果你這樣做:
$timestamp1 = new DateTime($string1);
$timestamp1->setTimezone(new DateTimeZone('UTC'));
然后,您將始終明確設定時區,可能會更改原來指定的時區。如果你兩者都做:
$timestamp1 = new DateTime($string1, new DateTimeZone('UTC'));
$timestamp1->setTimezone(new DateTimeZone('UTC'));
然后你說,“如果這個字串不包含時區,則認為它是 UTC,如果它確實包含不是 UTC 的時區,則將其轉換為 UTC。”
有沒有辦法檢查 DateTime 是否為輸入字串生成了時區?
如果第二個時間戳也不包含明確的時區,您可以提取上一步中使用的時區并將其應用為第二個時間戳的默認值:
$timestamp1 = new DateTime($string1, new DateTimeZone('UTC'));
$timestamp2 = new DateTime($string2, $timestamp1->getTimezone());
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/496832.html
