由于某种原因,PHP开发人员不久前决定不想信任系统可用的时区信息。因此,如果要使用时间/日期函数,则在OSX下的PHP脚本必须执行以下操作:
date_default_timezone_set ("Europe/London");
现在,我不知道我的脚本将被执行在哪里,而且期望普通用户必须提供时区字符串是不合理的 - 用户将很合理地说,他们'已经在系统中设置了这一点,所以为什么我不能在那里寻找它。
所以,到目前为止,我一直在做:
$cmd = '/usr/sbin/systemsetup -gettimezone';
exec ($cmd, $results, $result);
并挑选结果以获取字符串。到目前为止,一切都很好。现在我观察了两件事:
此命令的人页面坚持认为我需要"至少admin priv才能运行"。我在没有Admin Priv的帐户上尝试了它,确实是这样,很长远,我需要另一种方法。
我碰巧将TimeZone窗格锁定在系统首选项中 -> date&时间,并重复观察到,每当锁定此窗格时,我就会在响应之前恰好在30秒内给出上述暂停。如果我解锁时区窗格,它会在通常的短时间内做出反应。
有人知道为什么会发生这种情况吗?
其次,有人知道我可以执行的替代命令来给我时区吗?
谢谢,
OS X通过在/etc/localtime到正确的时区域文件,在/usr/usr/share/zeardinfo/下,将符号链接从/etc/localtime创建符号链接来存储系统的时区。参见"男人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);
for 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代码。