将Windows时区转换为PHP设置的等效时区

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?

Mat*_*int 5

一些东西:

  1. systeminfo命令只显示Windows时区的显示名称.您将需要标识符.您可以使用它tzutil.exe /g来返回 - 虽然这仍然无法帮助您.

  2. PHP使用IANA时区,而不是Windows时区.有关两种不同类型时区的更多信息,请参阅timezone标记wiki.

  3. 两者之间的转换由CLDR此文件中处理.

  4. 对于PHP,您可以通过国际化包访问CLDR数据.通过向您的php.ini文件添加(或取消注释)来启用此功能:

    extension=php_intl.dll
    
    Run Code Online (Sandbox Code Playgroud)
  5. 然后,您只需调用以下函数即可将本地时区作为IANA标识符返回.(在内部,它依赖于ICU和CLDR进行翻译.)

    IntlTimeZone::createDefault()->getID()
    
    Run Code Online (Sandbox Code Playgroud)

    这将"America/Phoenix"在您的示例中返回.然后,您可以将其与PHP的任何常规时区功能一起使用,包括date_default_timezone_set您希望的时间.

  6. 尽管你可以这样做,但要仔细考虑你是否应该这样做.在大多数情况下,依赖于Web应用程序(或任何服务器端应用程序)的系统本地时区设置是一种反模式.改变时区太容易了.这是一个全局设置,通常不需要任何管理员权限.如果您的数据不是基于UTC的,那么您也会遇到问题,然后尝试将其从一台服务器迁移到另一台服务器.在绝大多数情况下,最好是考虑一下在应用逻辑电平的时区,而不是系统范围或应用程序范围内,并且通常应考虑托管代码的服务器的时区无关.