在OS X中:使用PHP或从Terminal中的命令提示符获取时区

use*_*763 5 php timezone

由于某些原因,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)

并挑选结果以使用字符串。到目前为止,一切都很好。现在,我观察到两件事:

  1. 该命令的手册页坚持我需要“至少要运行admin priv”。我是在没有admin priv的帐户上尝试过的,的确如此,因此从长期来看,我将需要另一种方法。

  2. 我碰巧在系统偏好设置->日期和时间中锁定了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 代码中剪切字符串。

  • 我认为应该是`-f 8,9`:`/bin/ls -l /etc/localtime | /usr/bin/cut -d '/' -f 8,9` (3认同)