aa *_* rr 2 php windows timezone datetime command-line-parsing
我正在开发一个应用程序,包括一个使用PHP和MySQL运行的Web服务器,用户通过设置的Web浏览器访问http://localhost.但我希望它可以在美国所有时区工作,包括亚利桑那州大部分没有遵守夏令时的时区.要配置此脚本,我需要使PHP使用与Windows相同的时区.
我有一个PHP脚本,从Windows上的命令行获取时区.然后需要将结果转换为PHP列表中的等效时区.
不幸的是,我没有看到一种直截了当的方式来做到这一点.这是脚本:
$comp_timezone = exec('systeminfo | findstr /C:"Time Zone"');
// results are: "Time Zone: (UTC-07:00) Arizona"
date_default_timezone_set($comp_timezone);
我需要做的是将字符串结果转换为$comp_timezone函数date_default_timezone_set可以使用的东西,但正如上面的示例所示,亚利桑那州不存在作为php的时区,最接近的是America/Phoenix.
那么如何将systeminfo时区转换为PHP?
一些东西:
该systeminfo命令只显示Windows时区的显示名称.您将需要标识符.您可以使用它tzutil.exe /g来返回 - 虽然这仍然无法帮助您.
PHP使用IANA时区,而不是Windows时区.有关两种不同类型时区的更多信息,请参阅timezone标记wiki.
对于PHP,您可以通过国际化包访问CLDR数据.通过向您的php.ini文件添加(或取消注释)来启用此功能:
extension=php_intl.dll
Run Code Online (Sandbox Code Playgroud)然后,您只需调用以下函数即可将本地时区作为IANA标识符返回.(在内部,它依赖于ICU和CLDR进行翻译.)
IntlTimeZone::createDefault()->getID()
Run Code Online (Sandbox Code Playgroud)
这将"America/Phoenix"在您的示例中返回.然后,您可以将其与PHP的任何常规时区功能一起使用,包括date_default_timezone_set您希望的时间.
尽管你可以这样做,但要仔细考虑你是否应该这样做.在大多数情况下,依赖于Web应用程序(或任何服务器端应用程序)的系统本地时区设置是一种反模式.改变时区太容易了.这是一个全局设置,通常不需要任何管理员权限.如果您的数据不是基于UTC的,那么您也会遇到问题,然后尝试将其从一台服务器迁移到另一台服务器.在绝大多数情况下,最好是考虑一下在应用逻辑电平的时区,而不是系统范围或应用程序范围内,并且通常应考虑托管代码的服务器的时区无关.