0

次の問題があります。異なる Windows マシンで複数の PHP システムを実行しています。これらのシステムは、現在の時刻を集中的に使用します。

現在、php.ini を構成し、特定のタイムゾーンに割り当てました。また、Windows は同じタイムゾーンに構成されており、すべてが期待どおりに機能します。

しかし、私の国では、州が夏時間を変更することを決定しました。そのため、管理者が Windows のタイムゾーンを変更し、PHP のタイムゾーンを変更しないままにしておくと、システムに不一致が生じることがあります。また、タイムゾーンを自動的に変更するウィンドウもあります。

タイムゾーンを無視して、PHP から現在のシステム時刻を取得する方法はありますか?

更新:

function time_zone_fix($timeGiven = "H:i:s")
{
    $shell = new COM("WScript.Shell") or die("Requires Windows Scripting Host");
    $time_bias = -($shell->RegRead("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation\\ActiveTimeBias")) / 60;
    $timestamp_bias = 60 * 60 * $time_bias;
    return gmdate($timeGiven, strtotime($timestamp_bias . " seconds"));
}

timezone/dsl が指定されているかどうかに関係なく、現在の日付と時刻を返します。ただし、新しい COM インターフェイスを作成することは決して効率的ではありません。

4

3 に答える 3

2
gmdate('Y-m-d H:i:s');

フォーマットを必要なものに変更します。「タイムゾーンのない日時」を返します。GMT (グリニッジ標準時)のように、グリニッジ平均のgm略です。GMT はUTC (Universal Time, Coordinated) に取って代わられているため、この関数は実際に呼び出す必要があります...utcdate()

しかし、最も移植性の高い時間の表現はUnix タイムスタンプです。つまり、1970-01-01 00:00:00 UTC から経過した秒数で、うるう秒は無視されます。

time();

の値はtime()、 の 2 番目のパラメーターの既定値でもありますgmdate()

ところで、うるう秒は 2012-06-30 23:59:60 に予定されています

注: 特定のタイムゾーンの時刻を取得する方法を求めているが、夏時間の修正を行わない場合は、次のように実行できます。

gmdate('Y-m-d H:i:s', time() + 3600 * $h);

ここ$hで、 は UTC からの時間単位のオフセット (アメリカでは負の数)、またはオフセットが完全な時間数でない場合:

gmdate('Y-m-d H:i:s', time() + 60 * $m);

ここ$mで、 は UTC からの分単位のオフセットです (たとえば、IST の場合は 330、インド標準時)。ただし、タイムゾーン オフセットが追加された Unix タイムスタンプ自体には意味がありません。

最後になりましたが、ネットワーク タイム プロトコルであるNTPを使用してシステムを同期することを忘れないでください。

于 2012-06-22T12:54:30.020 に答える
1

サポートされているタイムゾーンのPHPマニュアルリスト

... ここでは、PHP でサポートされているタイムゾーンの完全なリストを見つけることができますdate_default_timezone_set()。...

そして、これ:(UTCこのサブページから)

于 2012-06-22T12:45:36.730 に答える