1

このスクリプトは一貫性のない日数を返します。localhost では 14 日が返され、クライアント サーバーでは 15 日が返されます。

    $_POST['pickup_time'] = '13:30';
    $_POST['dropoff_time'] = '12:00';
    $_POST['pickup_date'] = '2013-10-16';
    $_POST['dropoff_date'] = '2013-10-30';


    $fmt_pickup_date = strtotime($_POST['pickup_date']);
    $fmt_dropoff_date = strtotime($_POST['dropoff_date']);

    $days = ceil(abs($fmt_dropoff_date - $fmt_pickup_date) / 86400);

    if ($vehicles[$v]['vehicle_cal_date']==0)
    {
        $fmt_pickup_time = str_replace(":", "", $_POST['pickup_time']);
        $fmt_dropoff_time = str_replace(":", "", $_POST['dropoff_time']);

        if (($fmt_dropoff_time-$fmt_pickup_time)>=1)
        {
            $days++;
        }
    }
    else { $days++; }

一部の日付では正しい日数が返され、一部の日付では間違った日数 (+1 日) が返されます。

    [pickup_time] => 11:00
    [dropoff_time] => 10:00
    [pickup_date] => 2013-10-28
    [dropoff_date] => 2013-11-01

これらの日付は、両方のサーバーで 4 日間返されます。

何か案は?なにが問題ですか?

編集:

これは次のようです:

    date_default_timezone_set('UTC');

問題が修正され、スクリプトは両方の日付に対して正しい日数を返すようになりました。どれくらいの期間 - わかりません。これですべての日付が修正されることを願っています:)

4

3 に答える 3

2

問題は非常に単純で、私が長い間繰り返してきた問題です...そしてもちろん、タイムゾーンをUTCに設定すると機能します!

なんで?

単純に、DST のためです。DST が開始または終了するとき、1 日は 24 時間ではありません (代わりに 23 または 25 時間)。したがって、24 時間である 86400 秒で計算すると、うまくいきません!

タイムゾーンを DST を使用しない UTC に設定することは回避策です。しかし、私の意見では、最もクリーンな解決策は DateTime クラスを使用して計算を行うことです: http://php.net/datetime これらの関数にはタイムゾーンのサポートが組み込まれているため、DST を正しく処理します。

于 2013-06-11T23:41:11.400 に答える
1

これは、localhost とクライアントのサーバーでの php セットアップの違いに関係している可能性があります。私が過去に行ったことは、それぞれの phpinfo() を比較して、問題がどこにあるかを確認することです。多分phpの日付設定?

于 2013-06-11T16:17:08.050 に答える