PHP时区在前还是在后?

PHP时区在前还是在后?,php,Php,我在谷歌上搜索过,读过一些关于时区和偏移量的PHP手册,但似乎找不到这个问题的答案 所以我想在这里问一下。请让我知道,如果这是一个重复的问题或有一个答案在其他地方,我将删除它 目前,我正在使用下面的代码来显示PHP中两个位置之间的时间差 代码运行良好,但存在一个问题。如果位置2第一个在位置2之后,结果将在数字前显示一个负号 例如:如果第一个地点是纽约,第二个地点是伦敦,则时差将显示为-5 如果是相反的方向,即伦敦第一,纽约第二,它将显示为5 我需要做的是像这样显示时差: 伦敦比纽约早5小时 或

我在谷歌上搜索过,读过一些关于时区和偏移量的PHP手册,但似乎找不到这个问题的答案

所以我想在这里问一下。请让我知道,如果这是一个重复的问题或有一个答案在其他地方,我将删除它

目前,我正在使用下面的代码来显示PHP中两个位置之间的时间差

代码运行良好,但存在一个问题。如果位置2第一个在位置2之后,结果将在数字前显示一个负号

例如:如果第一个地点是纽约,第二个地点是伦敦,则时差将显示为-5

如果是相反的方向,即伦敦第一,纽约第二,它将显示为5

我需要做的是像这样显示时差:

伦敦比纽约早5小时

纽约比伦敦晚5小时

这是我的密码:

<?php

if( isset($_POST['submit']))
{
    //be sure to validate and clean your variables
    $timezone1 = htmlentities($_POST['timezone1']);
    $timezone2 = htmlentities($_POST['timezone2']);

    //then you can use them in a PHP function. 
    function get_timezone_offset( $origin_tz, $remote_tz ) {
    $timezone1 = new DateTimeZone( $origin_tz );
    $timezone2 = new DateTimeZone( $remote_tz );

    $datetime1 = new DateTime("now", $timezone1);
    $datetime2 = new DateTime("now", $timezone2);

    $offset = $timezone1->getOffset($datetime1) - $timezone2->getOffset($datetime2);
    return $offset;

}

$offset = get_timezone_offset($timezone1, $timezone2);

}

?>
在这里,我重申了这一结果:

<?php echo $offset/3600; ?>
这是位置的HTML下拉列表:

<form id="myForm" name="myForm" class="myForm" method="post" action="">
  <select name="timezone2" id="timezone2" class="timezone2">
    <optgroup label="Africa">
                        <?php
                    foreach($options as $key => $value)
                    {
                        echo '<option value="'. $key .'" label="'. $value .'">'.$value.'</option>';
                    }
                    ?>
<option value="Africa/Abidjan" label="Abidjan">Abidjan</option>
<option value="Africa/Accra" label="Accra">Accra</option>
<option value="Africa/Addis_Ababa" label="Addis Ababa">Addis Ababa</option>
<option value="Africa/Algiers" label="Algiers">Algiers</option>
<option value="Africa/Asmara" label="Asmara">Asmara</option>


</optgroup>
</select>
顺便说一下,时区1和时区2下拉列表是相同的

有人能帮我解决这个问题吗

谢谢格林威治标准时间 如果您使用的时间是GMT,因为它是Unix时间戳,自Unix纪元1970年1月1日00:00:00 GMT以来一直在计算秒数。
希望有帮助:

这实际上是一个简单逻辑的问题。使用if语句并根据偏移值指定要回显的适当文本

$str = '';
if (0 > $offset)
{
   // For negative offset (hours behind)
   $hour_diff = $offset / 3600 * -1;
   $str = "{$hour_diff} hour(s) behind of";
}
elseif (0 < $offset)
{
   // For positive offset (hours ahead)
   $hour_diff = $offset / 3600;
   $str = "{$hour_diff} hour(s) ahead of";
}
else
{
   // Have you considered the case of same timezone?
   $str = "in the same timezone as";
}

echo "{$location1} is {$str} {$location2}";
主意 Use可以使用$offset符号来确定要显示的字符串:

正:A在B之前; 否定:A在B后面; 零:一样。 密码 工具书类
如果要更改结果的符号,可以执行以下操作:

如果你只想去掉负号

如果要删除符号来写句子,可以这样做:

<?php
//check direction
$direction = ($offset < 0)? "ahead" : "behind";
$direction = ($offset === 0)? "same timezone as" : $direction;
//remove the -
$hours = $offset/3600;
$hours = ($offset < 0) ? $hours*-1 : $hours;
//Get the cities from the Timezone
preg_match('#.*/([^/]+$)#',$timezone1,$city1);
preg_match('#.*/([^/]+$)#',$timezone2,$city2);
//echo sentence replacing underscores with spaces.
echo str_replace("_", " ", $city2[1]).' is '.$hours.' hours '.$direction.' '.str_replace("_", " ", $city1[1]);
?>

我认为这应该适用于您在问题中提供的代码。

从您的代码中不太清楚您实际想做什么,您是获得用户时区还是PHP时区,正如您所说的那样?@Lissy,我获得PHP时区。您的代码将生成SF 0小时,与相同时区的情况相同。@Sutandiono yep,这不是一个现成的解决方案,它给出了一个想法。用户可能会适应它的需要。我没有考虑相同的时区,我刚刚从@Sutandiono的答案中读到了它。我刚刚为这个选项添加了一些东西。这种方法可行,但结果是:纽约比伦敦晚18000小时。伦敦和纽约的时差只有5小时!你知道为什么会这样吗?而且,它显示伦敦比悉尼晚了32400小时!!这是有线的!很抱歉我已经对代码进行了更正,我忘了在这种情况下从秒转换为小时。
<?php
//check direction
$direction = ($offset < 0)? "ahead" : "behind";
$direction = ($offset === 0)? "same timezone as" : $direction;
//remove the -
$hours = $offset/3600;
$hours = ($offset < 0) ? $hours*-1 : $hours;
//Get the cities from the Timezone
preg_match('#.*/([^/]+$)#',$timezone1,$city1);
preg_match('#.*/([^/]+$)#',$timezone2,$city2);
//echo sentence replacing underscores with spaces.
echo str_replace("_", " ", $city2[1]).' is '.$hours.' hours '.$direction.' '.str_replace("_", " ", $city1[1]);
?>