1

Google で検索し、タイムゾーンとオフセットに関する PHP のマニュアルをいくつか読みましたが、この質問に対する答えが見つからないようです!

なのでここで質問します。これが重複した質問であるか、他の場所に回答がある場合はお知らせください。削除します。

現在、次のコードを使用して、PHP の 2 つの場所の時差を表示しています。

コードは正常に動作しますが、問題があります。2location first" が "location two" の後ろにある場合、結果は数値の前にマイナスで表示されます。

たとえば、最初の場所がニューヨークで 2 番目の場所がロンドンの場合、時差は -5 と表示されます。

逆の場合、つまりロンドンが 1 位でニューヨークが 2 位の場合は 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

4 に答える 4

0

グリニッジ標準時
time() を使用している場合、Unix エポック (1970 年 1 月 1 日 00:00:00 GMT) からの秒数をカウントしている Unix タイムスタンプであるため、GMT です。
それが役立つことを願っています:)

于 2013-08-27T15:58:23.370 に答える
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}";
于 2013-08-27T15:58:55.223 に答える
0

考え

あなたのサインを使用して、$offset表示する文字列を決定できます。

  • ポジティブ: A が B よりも進んでいる。
  • ネガティブ: A が 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);

参考文献

于 2013-08-27T16:01:17.317 に答える
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]);
?>

これは、質問で提供したコードで機能するはずです。

于 2013-08-27T16:39:04.400 に答える