6

何らかの理由で、PHP開発者は、システムから入手できるタイムゾーン情報を信頼したくないと少し前に判断しました。したがって、OSXでのPHPスクリプトは、任意の日時関数を使用する場合、次のようなことを行う必要があります。

date_default_timezone_set ("Europe/London");

さて、私のスクリプトが地球上のどこで実行されるのかわかりません。通常のユーザーがタイムゾーン文字列を指定する必要があると期待するのは不合理です。ユーザーは、かなり合理的に、すでに実行していると言うでしょう。システム設定でそれを設定して、なぜそこでそれを探すことができないのか。

だから、今まで、私はやっています:

$cmd = '/usr/sbin/systemsetup -gettimezone';
exec ($cmd, $results, $result);

結果を選択して、使用する文字列を取得します。ここまでは順調ですね。今私は2つのことを観察します:

  1. このコマンドのマニュアルページには、「実行するには少なくともadminpriv」が必要であると記載されています。admin privのないアカウントで試しましたが、これは確かに当てはまるので、長期的には別のアプローチが必要になります。

  2. たまたま[システム環境設定]->[日付と時刻]でタイムゾーンペインをロックしましたが、このペインがロックされるたびに、上記のsystemsetupコマンドが応答する前に正確に30秒間一時停止することを繰り返し観察しました。TimeZoneペインのロックを解除すると、通常の短時間で応答します。

なぜこれが起こっているのか誰かが知っていますか?

次に、管理者権限を必要としないタイムゾーンを指定するために実行できる代替コマンドを知っている人はいますか?

ありがとう、

4

2 に答える 2

4

OS X は、/etc/localtime から /usr/share/zoneinfo/ の下の正しいタイム ゾーン ファイルへのシンボリック リンクを作成することにより、システムのタイム ゾーンを保存します。「man 3 tzset」を参照してください。

既に PHP を使用しているため、次のようにしてタイム ゾーンの名前を取得できます。

$systemZoneName = readlink('/etc/localtime');
$systemZoneName = substr($systemZoneName, strlen ('/usr/share/zoneinfo/'));

次に、これをデフォルトのタイムゾーンにするには、次のようにします。

date_default_timezone_set ($systemZoneName);

あなたもできるはずです

ini_set('date.timezone', $systemZoneName);

または、DateTimeZone オブジェクトだけが必要な場合は、

$systemZone = new DateTimeZone ($systemZoneName);
于 2016-06-03T20:14:59.330 に答える
2

OSX での PHP スクリプト用

<?php
$systemtimezone = exec('/bin/ls -l /etc/localtime|/usr/bin/cut -d"/" -f7,8');
date_default_timezone_set($systemtimezone); 
?>

これは、PHPがOS Xシステムのデフォルトのタイムゾーンを読み取る方法です

ps: 将来の更新で許可されなくなった場合、EXEC 内のパイプは適切ではない可能性があります。代わりに、PHP コード内の文字列を切り取る必要があるかもしれません。

于 2015-09-16T09:28:01.107 に答える