[英]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.