由于某些原因,PHP开发人员不久前决定,他们不想信任系统中可用的时区信息。因此,如果要使用任何时间/日期函数,则OSX下的PHP脚本必须执行以下操作:
date_default_timezone_set ("Europe/London");
Run Code Online (Sandbox Code Playgroud)
现在,我不知道我的脚本将在地球上的哪个位置执行,并且期望普通用户必须提供时区字符串是不合理的-用户将很合理地说,他们已经在系统偏好设置中进行设置,为什么我不能在那里找到它。
因此,到目前为止,我一直在做:
$cmd = '/usr/sbin/systemsetup -gettimezone';
exec ($cmd, $results, $result);
Run Code Online (Sandbox Code Playgroud)
并挑选结果以使用字符串。到目前为止,一切都很好。现在,我观察到两件事:
该命令的手册页坚持我需要“至少要运行admin priv”。我是在没有admin priv的帐户上尝试过的,的确如此,因此从长期来看,我将需要另一种方法。
我碰巧在系统偏好设置->日期和时间中锁定了TimeZone窗格,并反复观察到,只要此窗格被锁定,我在上面给出的systemsetup命令都会暂停30秒钟,然后再进行响应。如果我打开“时区”窗格,它会在通常的短时间内响应。
有人知道为什么会这样吗?
其次,是否有人知道我可以执行的替代命令给我时区,而无需admin priv?
谢谢,
小智 5
OS X 通过从 /etc/localtime 到 /usr/share/zoneinfo/ 下的正确时区文件建立符号链接来存储系统的时区。请参阅“man 3 tzset”。
由于您已经使用 PHP,因此可以执行以下操作来获取时区名称:
$systemZoneName = readlink('/etc/localtime');
$systemZoneName = substr($systemZoneName, strlen ('/usr/share/zoneinfo/'));
Run Code Online (Sandbox Code Playgroud)
然后,要使其成为默认时区,您可以执行以下操作:
date_default_timezone_set ($systemZoneName);
Run Code Online (Sandbox Code Playgroud)
你也应该能够做到
ini_set('date.timezone', $systemZoneName);
Run Code Online (Sandbox Code Playgroud)
或者,如果您只需要一个 DateTimeZone 对象,
$systemZone = new DateTimeZone ($systemZoneName);
Run Code Online (Sandbox Code Playgroud)
小智 2
OSX 下的 PHP 脚本
<?php
$systemtimezone = exec('/bin/ls -l /etc/localtime|/usr/bin/cut -d"/" -f7,8');
date_default_timezone_set($systemtimezone);
?>
Run Code Online (Sandbox Code Playgroud)
这就是 PHP 读取 OS X 系统默认时区的方法
ps:如果在未来的更新中不允许使用 EXEC 中的管道,则可能不是一个好主意,您可能需要在 PHP 代码中剪切字符串。