簡體   English   中英

將 UTC 時間戳字符串轉換為 UNIX 時間戳數字 - Javascript 與 PHP

[英]Converting UTC timestamp string to UNIX timestamp number - Javascript vs PHP

不要用以下內容回答這個問題:

  • “Javascript UNIX 時間戳以毫秒為單位,PHP UNIX 時間戳以秒為單位”
  • “Javascript 在瀏覽器中運行,PHP 在服務器上運行,時鍾可能不匹配”

對此效果的任何答案都將被否決!

我遇到了一個問題,即在完全相同的計算機上,Node.js 和 PHP 在將 UTC 時間戳字符串轉換為 UNIX 時間戳整數時會產生不同的時間戳。

PHP中的參考代碼:

$a = '2022-07-20T17:30:28.771';
list($b, $c) = explode('.', $a);
$d = strtotime($b) * 1000 + ((int) $c);
// $d is 1658338228771 ms

在 Javascript 中:

const a = '2022-07-20T17:30:28.771';
const b = new Date(a);
const d = b.valueOf();
// d is 1658352628771 ms

看到不同:

PHP:     1658338228771 milliseconds
Node.js: 1658352628771 milliseconds

差值正好是 14400000 毫秒(4 小時)。

由於我在 EDT 時區 (UTC-4:00),這可能解釋了差異。 我的問題是,我該如何調整?

將 UTC 時間戳轉換為在 PHP 和 Javascript 中都匹配的毫秒精度的 UNIX 時間戳的正確過程是什么?

在進一步調查中,我的 PHP 默認時區設置為 UTC,因此時間戳被解釋為 UTC。

另一方面,Javascript 將其解釋為本地時間戳。

無論時區設置如何,要可靠地將 UTC 時間戳轉換為 UNIX 時間戳,我需要這樣做:

在 PHP 中:

$a = '2022-07-20T17:30:28.771Z';
$b = new DateTime($a);
$d = (int) $b->format('Uv');
// 1658338228771

在 Javascript 中:

const a = '2022-07-20T17:30:28.771Z';
const b = Date.parse(a);
const d = b.valueOf();
// 1658338228771

在這兩種情況下,重要的是 UTC 時間戳以Z結尾,以便解析器知道將其視為 UTC。

  • 使用 UTC 時區創建日期時間對象。
  • 增加 4 小時
  • 獲取時間戳。
$dateTime = new DateTime('2022-07-20T17:30:28.771', new DateTimeZone('UTC'));
$dateTime->add(new DateInterval('PT4H'));
echo $dateTime->format('Uv');

打印與您的 javascript 代碼相同。

1658352628771

你可以用那個...

 const UTC_timestamp = YMD_hmsx => // date string conversion to UTC timestamps { let [Y,M,D,h,m,s,x] = YMD_hmsx.split(/\-|T|\:|\.|\Z/).map(Number) return new Date(Date.UTC(Y,--M,D,h,m,s,x)).getTime() } console.log( UTC_timestamp('2022-07-20T17:30:28.771') ) // return -> 1658338228771 , same as PHP
 .as-console-wrapper {max-height: 100% !important;top: 0;} .as-console-row::after {display: none !important;}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM