0

了解しました。ユーザー入力時刻をGMTに正しく変換しているかどうかはわかりません。複数のタイムゾーンにまたがるユーザーに「イベント」を入力してもらい、現在の「イベントまでの期間」または「それ以降の期間」を確認できる必要があります。time();

これが私が彼らが入力した時間を変換することを計画していた方法です。07/21/2011 01:30 amそれは、Thenのようなものとして始まります。

echo gmdate('Y-m-d H:i:s',strtotime('07/21/2011 01:30 am'));

私にくれます2011-07-21 08:30:00

そこで、その価値をとって、「このイベントまでの時間」をユーザーに表示することを計画していましgmdate('Y-m-d H:i:s',strtotime('07/21/2011 01:30 am'));time()。しかし、結果には常に10時間が追加されているようです。したがって、今から30分後にイベントをスケジュールした場合、今から10時間30分と表示されます。だから、現地時間を正しく変換していないと思っているのです。

私は何が欠けていますか?たぶん私はGMTを正しく理解していません。関係するすべての時間がGMTであることを確認して、すべての時間がWebサイトのすべてのユーザーに共通であることを確認するにはどうすればよいですか?

役立つ場合のその他の情報:サーバーのタイムゾーンはAmerica/Los_Angeles

編集:みんなの提案の後、私はこれを私のphpコードの上部に設定しようとしました:

date_default_timezone_set("GMT");

差分を計算するために使用date('Y-m-d H:i:s')してみましたが、10時間後ではなく「3時間前」と表示されています。したがって、これは間違いなく物事を変えました。

しかし、それでも正しくありません。

date('Y-m-d H:i:s')正しい現在のGMTを返していることを確認しました。いいですね。

ただし、ユーザー入力日はオフです。どうすれば間違って変換できますか?


もう一度編集(Salman Aの提案後のいくつかのテスト結果を含む):

2:55am-私の現在の現地時間EST

date('Y-m-d H:i:s')として表示されます2011-07-21 06:56:43-これは正しいです

3:00 am ESTは、私が次のように提出した将来の時間です。07/21/2011 03:00 am

「変換」してDBに送信する時間を取得する方法は次のとおりです。

$time = $_POST['time'];

//there is where im assuming it turns my EST time to the GMT equivalent.
$the_date = strtotime($time . ' GMT');

$utctime = gmdate('Y-m-d H:i:s',$the_date);

イベントが今から5分後に通知されることを関数が期待していますが、その時間は休みです。

ユーザーが送信した時刻が実際にGMTi表示に変換され、08:00または07:00ではない-として表示されることを確認するためだけに(そのうちの1つはGMTに相当すると思います$utctime2011-07-21 03:00:00

では、どうすれば変換できますか?

ですから、私が見ているのはstrtotime($time . ' GMT');、私が提供する現地時間にGMTを適用しているようには見えません。ちなみに、誰かがdate_default_timezone_set("GMT");私のコードにあることを示唆したので、私はそれを一番上に持っています。削除する必要がありますか?しかし、それを削除するとGMTが正しくないことに気づきました。だから私はそれを残しました。

4

3 に答える 3

2

単純に 2 つの時間値の差を計算する必要がある場合:

<?php
$time = '07/21/2011 11:30 am';
$timeleft = strtotime($time) - time();
// target time....: 2011-07-21 11:30:00 
// current time...: 2011-07-21 11:13:45
// difference.....: 975 seconds (16 min, 15 seconds)

上記の例では$time、関数で使用されるものと同じタイムゾーン、time()つまりサーバーのタイムゾーンがあると想定しています。

タイムゾーンが異なる場合は、減算が期待どおりに機能するように正規化する必要があります。GMTたとえば、データベースに日付/時刻を保存している場合、上記の例は次のようになります。

<?php
$time = '07/21/2011 06:30 am';
$timeleft = strtotime($time . ' GMT') - time();
// target time............: 2011-07-21 06:30:00 GMT
// converted local time...: 2011-07-21 11:30:00 PKT
// current time...........: 2011-07-21 11:34:48 PKT
// difference.............: -288 seconds (minus 4 minutes, 48 seconds)

編集 1

このコードについて:

$time = $_POST['time'];

ユーザーが世界のさまざまな地域にいる場合は、次のいずれかを行う必要があります。

  • 日付/時刻を GMT で入力するように依頼する
  • 入力した日付のタイムゾーンを入力するように依頼する

後でサーバー側で日付を変換してデータベースに保存できます。

<?php
$source_time     = '2011-07-21 17:00';
$source_offset   = '-0700'; // PDT
$local_timestamp = strtotime($source_time . ' ' . $source_offset); // 2011-07-22 05:00 PKT (SERVER TIME)
list(
    $temp_hh,
    $temp_mm
)                = explode(':', date('P')); // returns difference between SERVER TIME and GMT
$local_offset    = $temp_hh * 3600 + $temp_mm * 60;
$gmt_timestamp   = $local_timestamp + $local_offset;
echo date("Y-m-d H:i:s", $gmt_timestamp); // 2011-07-21 10:00:00
                                          // THIS is what you store in your database
                                          // Same as 2011-07-21 17:00:00 minus 7 hours

タイムゾーン情報がないと、計算は信頼できなくなります。

編集#2

実際には...もっと簡単です:

<?php
$source_time   = '2011-07-21 17:00';
$source_offset = -7.0; // -0700
echo date("Y-m-d H:i:s", strtotime($source_time) + $source_offset * 3600);
// 2011-07-21 10:00:00
// THIS is what you store in your database

編集 #3

<input type="text" name="time" id="time" value="07/21/2011 17:00">
<input type="text" name="offset" id="offset">
<script type="text/javascript">
    document.getElementById("time").onchange = function(){
    var d = new Date(this.value);
    alert('Date entered: ' + d + '\nDate to GMT: ' + d.toUTCString());
    }
    document.getElementById("offset").value = (new Date()).getTimezoneOffset() / 60;
</script>

デモはこちら

于 2011-07-21T05:51:57.333 に答える
1

スクリプトのタイムゾーンを明示的に設定することをお勧めします。例えば:

date_default_timezone_set('Europe/London');

これにより、すべての日付関数が GMT で日付を返すようになり、BST も考慮されると思います。

于 2011-07-21T08:20:01.197 に答える
1

こんにちは、私はポーランドに住んでいて、CET の時間があります。CET を GMT に変換するには、関数を使用しています。

function convertCETtoGMT($timeCET)
    {
        date_default_timezone_set('EUROPE/London');
        $time = $timeCET." CET";
        $timeGMT = date('Y-m-d H:i:s', strtotime($time));
        date_default_timezone_set('EUROPE/Warsaw'); //set back to CET
        return $timeGMT;
    }
于 2019-03-01T11:30:08.903 に答える