如何在主配置中更新当前时区?

How can update Current Timezone in the main configuration?

config/app.php

'timezone' => 'America/New_York',

我正在尝试根据 clientTimeZone Asia/Kolkata

更新我的 app.timezone
$date = new DateTime();
$timeZone = $date->getTimezone();
echo $timeZone->getName().PHP_EOL;

$timezone_offset_minutes = 330; 
$clientTimeZone = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);
echo $clientTimeZone .PHP_EOL;

Session::put('clientTimeZone',$clientTimeZone);
config('app.timezone', $clientTimeZone);

$date = new DateTime();
$timeZone = $date->getTimezone();
echo $timeZone->getName() .PHP_EOL;

这是结果

America/New_York 
Asia/Kolkata 
America/New_York

我有种感觉

config('app.timezone', $clientTimeZone);

没有生效

DateTime class 接受两个参数,第二个是 ?DateTimeZone $timezone = null。如果省略或为空,将使用当前时区。

$timezone = new DateTimeZone('America/New_York');
$date = new DateTime('now', $timezone);   

Laravel 的 app.timezone 配置不直接影响 DateTime。

在 bootstrapping Laravel 应用程序上,它以这种方式设置时区

date_default_timezone_set($config->get('app.timezone', 'UTC'));

要使用客户端时区,您可以在会话期间全局设置它

$timezone_offset_minutes = 330; 
$clientTimeZone = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);
date_default_timezone_set($clientTimeZone);

请记住它不会影响任何其他应用程序,即 mysql。 Mysql 仍将使用 app.timezone 在申请 bootstrap 上阅读。

我建议将客户端时区传递给任何方法、函数并以这种方式使用它

$timezone_offset_minutes = 330; 
$clientTimeZone = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);
$this->getClientDateTime(new DateTimeZone($clientTimeZone));

//...

public function getClientDateTime(DateTimeZone $dateTimeZone): string
{
    return new DateTime('now', $dateTimeZone->format('Y-m-d H:i:s');
}