php中的时区转换

php中的时区转换,php,datetime,timezone,timestamp,Php,Datetime,Timezone,Timestamp,有谁能推荐一种简单的方法来将日期和时间转换为php中的不同时区吗?您可以使用datetime对象或其函数别名来实现此目的: 编辑有关评论的内容 但我不能使用这种方法,因为我需要在用户从不同位置登录时显示不同时区的日期 这不是问题。当用户登录时,您确定他的时区并将其设置为DateTime对象,如图所示。我在我的一个项目中使用了类似的方法,效果非常好 在数据库中,我需要得到任何一个时区的日期,然后只有它才能被正确处理 您可以将时间作为时间戳或日期时间存储在一个时区中。查询DateTime字段时,您可

有谁能推荐一种简单的方法来将日期和时间转换为php中的不同时区吗?

您可以使用datetime对象或其函数别名来实现此目的:

编辑有关评论的内容

但我不能使用这种方法,因为我需要在用户从不同位置登录时显示不同时区的日期

这不是问题。当用户登录时,您确定他的时区并将其设置为DateTime对象,如图所示。我在我的一个项目中使用了类似的方法,效果非常好

在数据库中,我需要得到任何一个时区的日期,然后只有它才能被正确处理


您可以将时间作为时间戳或日期时间存储在一个时区中。查询DateTime字段时,您可以将DateTime对象中的时间转换为此时区,或者(如果db支持)使用选定时区进行查询。

更简单的方法如下所示:

date_default_timezone_set('Europe/London'); // your user's timezone
$my_datetime='2013-10-23 15:47:10';
echo date('Y-m-d H:i:s',strtotime("$my_datetime UTC"));
如上所述,strotime也接受时区,您只需将其附加到datetime


我建议您将所有日期时间存储在UTC中,因为这样您就不会遇到夏令时的问题。

这对我很有效,而且非常干净

function convert_to_user_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC')
{
    try {
        $dateTime = new DateTime ($date, new DateTimeZone($serverTimeZone));
        $dateTime->setTimezone(new DateTimeZone($userTimeZone));
        return $dateTime->format($format);
    } catch (Exception $e) {
        return '';
    }
}

function convert_to_server_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC')
{
    try {
        $dateTime = new DateTime ($date, new DateTimeZone($userTimeZone));
        $dateTime->setTimezone(new DateTimeZone($serverTimeZone));
        return $dateTime->format($format);
    } catch (Exception $e) {
        return '';
    }
}

//example usage
$serverDate = $userDate = '2014-09-04 22:37:22';
echo convert_to_user_date($serverDate);
echo convert_to_server_date($userDate);
面向对象风格

<?php
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";

$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>
UTC至本地:

<?php
$datetime = date("Y-m-d H:i:s");
$utc = new DateTime($datetime, new DateTimeZone('UTC'));
$utc->setTimezone(new DateTimeZone('America/Sao_Paulo'));
echo $utc->format('Y-m-d H:i:s');

?>

这些答案对我都不起作用,我跳过了尝试过大的代码。我还认为仅仅为了一次转换就改变默认时区是很奇怪的

以下是我的解决方案:

function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null)
{
  if (empty($timeZoneSource)) {
    $timeZoneSource = date_default_timezone_get();
  }
  if (empty($timeZoneTarget)) {
    $timeZoneTarget = date_default_timezone_get();
  }

  $dt = new DateTime($dateString, new DateTimeZone($timeZoneSource));
  $dt->setTimezone(new DateTimeZone($timeZoneTarget));

  return $dt->format("Y-m-d H:i:s");
}
因此,要转换为服务器默认值,只需传递一个时区:

changeTimeZone("2016-10-24 16:28", "Asia/Tokyo");
要将服务器默认值转换为用户,请将第二个参数保留为null或空白:

changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo");
要在与默认值无关的2个时区之间切换,您需要提供2个时区:

changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");

我总是很难记住setTimezone方法到底是如何工作的。是根据时区调整日期时间吗?或者它是否需要一个给定的日期时间,去掉它的时区,然后使用你传递的那个?总而言之,我希望有一个更直观的方法来处理时区

我喜欢这个:

(new AdjustedAccordingToTimeZone(
    new DateTimeFromISO8601String('2018-04-25 15:08:01+03:00'),
    new Novosibirsk()
))
    ->value();
它以新西伯利亚时区输出ISO8601格式的日期时间


这种方法使用蛋白酥库,查看a以了解更多示例。

谢谢Gordon,但我不能使用此方法,因为我需要在用户从不同的时区登录时显示不同时区的日期locations@raki:因此,在用户登录之后-设置日期\u默认\u时区\u使用正确的用户所选时区进行设置。这也是不可能的。。因为在数据库中,我需要得到任何一个时区的日期,然后只有它才能在数据库中被正确处理。你可以将所有内容存储在GMT中。否则,它就会变成一个无法管理的混乱。所有这些都比需要的要复杂得多。如果我设置默认时区,那么我为获取创建/更新的时间所做的日期'Y-m-d H:i:s'位将在用户时区中。因此,我必须将它们转换为UTC。到处都有很多变化,确保我没有做两次转换。这真的是阻抗不匹配。回答得好。我更喜欢try-catch而不是isempty,以避免时区字符串中出现任何拼写错误。试试{new DateTimeZone$timeZoneSource;}catchException$e{$timeZoneSource=date\u default\u timezone\u get;}这正是我要找的。。。谢谢你,兄弟
function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null)
{
  if (empty($timeZoneSource)) {
    $timeZoneSource = date_default_timezone_get();
  }
  if (empty($timeZoneTarget)) {
    $timeZoneTarget = date_default_timezone_get();
  }

  $dt = new DateTime($dateString, new DateTimeZone($timeZoneSource));
  $dt->setTimezone(new DateTimeZone($timeZoneTarget));

  return $dt->format("Y-m-d H:i:s");
}
changeTimeZone("2016-10-24 16:28", "Asia/Tokyo");
changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo");
changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");
(new AdjustedAccordingToTimeZone(
    new DateTimeFromISO8601String('2018-04-25 15:08:01+03:00'),
    new Novosibirsk()
))
    ->value();