PHP时区前后?

时间:2013-08-27 15:44:12

标签: php

我在Google上搜索并阅读了一些关于时区和偏移量的PHP手册,但似乎无法找到这个问题的答案!

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

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

代码工作正常但是有一个问题。如果第一个“位置”位于“位置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>

顺便说一下,timezone1和timezone2下拉列表是相同的。

有人可以帮我解决这个问题吗?

由于

4 个答案:

答案 0 :(得分:0)

格林威治标准时间
好吧,如果你的使用时间(),它是在GMT,因为它是自Unix时代(1970年1月1日00:00:00 GMT)以来的Unix时间戳计数秒。 希望有所帮助:)

答案 1 :(得分:0)

这实际上是一个简单逻辑的问题。使用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}";

答案 2 :(得分:0)

使用可以使用您$offset的符号来确定要显示的字符串:

  • 正面:领先于B;
  • 否定:B背后;
  • 零:相同。

代码

function tzPosition( $number ) {
    return ( $number > 0 ) ? 'ahead' : ( ( $number < 0 ) ? 'behind' : 'same' );
} 
echo sprintf("%s is %s hours %s of %s", $cityA, abs($offset), tzPosition($offset), $cityB);

参考

答案 3 :(得分:0)

如果您想更改结果的符号,可以执行以下操作:<?php echo $offset/3600*-1; ?>

如果您只想删除减号<?php echo ($offset < 0) ? $offset/3600*-1 : $offset; ?>

如果您要删除写下该句子的标志,您可以这样做:

<?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]);
?>

我认为这应该与您在问题中提供的代码一起使用。