簡體   English   中英

將日期從本地時區轉換為 UTC

[英]Converting a date from local timezone to UTC

我有一個基於 Laravel 的應用程序,美國各地的人都在使用它。

當用戶執行特定操作時,我在 Javascript 中捕獲時間戳,然后我將該時間戳作為表單數據提交,供 Laravel/PHP 處理。

我在 Javascript 中捕獲的時間戳采用典型的“YYYY-MM-DD HH:MM:SS”格式。

我將用戶所在的時區存儲在數據庫中。

我基本上想獲取該時間戳,並將其轉換為 UTC 時間,以便數據庫中的所有時間戳都是 UTC。

那就是我掙扎的地方。

我有以下 PHP 代碼:

$defaultTime = request('submitted-time-stamp'); //In this case, we'll say 2022-12-21 12:01:01
$defaultTZ = $user->time_zone; //Translates to America/Denver

$utcTime = new DateTime($defaultTime);
$convertedTime = $utcTime1->setTimeZone(new DateTimeZone('UTC'));
$formattedTime = $convertedTime->format("Y-m-d H:i:s");

echo $formattedTime;

這段代碼——它沒有產生任何錯誤……但它顯示了錯誤的時間。 它顯示的是它進入的時間,而不是轉換為 UTC 的時間。

基本上,如果我提交“2022-12-21 12:01:01”作為時間,轉換后的時間應該是“2022-12-21 19:01:01”,但它仍然只是回應“2022-12- 21 12:01:01”。

我在這里錯過了什么?

setTimezone()更改對象創建時使用的默認時區。 即,它的意思是“從現有時區轉換到這個新時區”。 這並不意味着“將時間解釋為就好像它在這個時區一樣”。 如果原始字符串不包含某種時區標識符,那么該默認值就是您的 PHP 配置所說的任何內容。

$when = new DateTime('2022-12-21 12:01:01');
echo $when->getTimeZone()->getName();

這將與以下內容相同:

echo date_default_timezone_get();

這可能不是您想要的,除非您的所有用戶都與您的服務器處於同一時區。

為了在與服務器默認時區不同的特定已知時區中創建 DateTime 對象,您需要以下兩件事之一——輸入字符串中的時區表示:

$when = new DateTime('2022-12-21 12:01:01 America/New_York');

或者將顯式默認時區作為第二個參數傳遞給 DateTime 構造函數:

$userDefaultTzStr = 'America/New_York'; // read this value from the database
$defaultTz = new DateTimeZone($userDefaultTzStr);
$when = new DateTime('2022-12-21 12:01:01', $defaultTz);

后一種方法(可能)是首選。 如果輸入字符串包含任何類型的時區標識符,則將使用它並忽略第二個參數。 但是,如果輸入字符串不包含任何類型的時區標識符,則該字符串將被解釋為就好像它在指定的時區中一樣。

使用 Carbon 非常簡單。

use Carbon\Carbon;

$date = Carbon::create(request('submitted-time-stamp'), $user->time_zone);
$date->tz('UTC');

echo $date->format('Y-m-d H:i:s');

Laravel 的Date facade 應該是一樣的。

use Illuminate\Support\Facades\Date;

$date = Date::create(request('submitted-time-stamp'), $user->time_zone);
$date->tz('UTC');

echo $date->format('Y-m-d H:i:s');

暫無
暫無

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

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