6

出于某种原因,PHP 开发人员不久前决定他们不想信任系统提供的时区信息。因此,如果您在 OSX 下的 PHP 脚本要使用任何时间/日期函数,则必须执行以下操作:

date_default_timezone_set ("Europe/London");

现在,我不知道我的脚本将在地球上的哪个地方执行,并且期望普通用户必须提供时区字符串是不合理的 - 用户会说,相当合理,他们已经在系统首选项中设置它为什么我不能在那里寻找它。

所以,到目前为止,我一直在做:

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

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

  1. 该命令的手册页坚持我需要“至少 admin priv 才能运行”。我在没有 admin priv 的帐户上尝试过,确实是这样,所以从长远来看,我需要另一种方法。

  2. 我碰巧在 System Preferences -> Date&Time 中锁定了 TimeZone 窗格,并且反复观察到,每当此窗格被锁定时,我在上面给出的 systemsetup 命令在响应之前会暂停 30 秒。如果我解锁 TimeZone 窗格,它会在通常的短时间内做出响应。

有谁知道为什么会这样?

其次,是否有人知道我可以执行的替代命令来给我时区,不需要管理员权限?

谢谢,

4

2 回答 2

4

OS X 通过从 /etc/localtime 到 /usr/share/zoneinfo/ 下的正确时区文件的符号链接来存储系统的时区。参见“人 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 回答