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