如何使用 Laravel 将任何时区转换为 UTC

How to convert any time zone into UTC using Laravel

我想转换用户的时间,例如。 08:45 P.M, 到 UTC 时区。我该怎么做?

if ($request->open_at)
{
  $time = Carbon::parse($request->open_at)->toUTCString();
  dd($time);
  $query->whereTime('open_at', '>=', $time);
}

使用这种PHP方法:

$time = new DateTime("08:45 P.M");
$time ->setTimezone(new DateTimeZone("UTC"));
echo $time ->format("Y-m-d H:i:s e");

像这样,但除非您总是从系统时区开始(在 PHP 中配置),否则 date 必须已经设置了正确的时区才能正常工作,就像其他人提到的那样。

$time = Carbon::parse($request->open_at);
$time->setTimezone('UTC');
...

Carbon 扩展了 DateTime 对象,包括 setTimezone

Carbon 有 ->utc() 方法(等同于 setTimezone('UTC'))并且 Laravel 查询构建可以获取 Carbon 对象而无需将其格式化为字符串:

$query->whereTime('open_at', '>=', Carbon::parse($request->open_at)->utc());

使用设置时区功能转换时间

$time = Carbon::parse($request->open_at);
$time->setTimezone('UTC');

用户的时区可以输入 parse() 的可选第二个参数。我也一直找不到任何 toUTCString() 方法 ()。总计:

$userTimeZone = 'Europe/Berlin'; // We'll come to this later
$time = Carbon::parse($request->open_at, $userTimeZone)->setTimezone('UTC');
echo $time->format('r');

例如:

foreach (['Asia/Tokyo',  'Europe/Berlin', 'America/Los_Angeles'] as $userTimeZone) {
    echo "$userTimeZone\n";
    $time = Carbon::parse('08:45 P.M', $userTimeZone);
    echo $time->format('r'), "\n";
    $time->setTimezone('UTC');
    echo $time->format('r'), "\n\n";
}
Asia/Tokyo
Fri, 24 Dec 2021 20:45:00 +0900
Fri, 24 Dec 2021 11:45:00 +0000

Europe/Berlin
Fri, 24 Dec 2021 20:45:00 +0100
Fri, 24 Dec 2021 19:45:00 +0000

America/Los_Angeles
Thu, 23 Dec 2021 20:45:00 -0800
Fri, 24 Dec 2021 04:45:00 +0000

当然,如果您不知道用户所在的时区,那么所有这些都是毫无意义的。 你有这样的信息吗?最简单的方法可能就是问,虽然你也可以使用一些技巧来尝试和猜测,例如:

  • 客户端JavaScript
  • 地理定位 API