代码之家  ›  专栏  ›  技术社区  ›  Jay Bienvenu

在PHP中确保Unix时间

  •  0
  • Jay Bienvenu  · 技术社区  · 6 年前

    我的代码假设零代表Unix时代的开始,1970-01-01 00:00。我升级了一个PHP安装,现在,突然之间,零代表1970-01-01:00(通过 date('Y-m-d H:i', 0) ).所以很明显这是一个时区问题。我把同样的代码放进沙箱,得到1969-12-31 16:00。我有几个单元测试因此而失败。时区不会也不应该在这里发挥作用。

    我如何确保日期时间功能,如 date() 是否始终将零转换为1970-01-01 00:00,而不考虑特定安装的时区设置?

    3 回复  |  直到 6 年前
        1
  •  0
  •   Jeff    6 年前

    使用 gmdate() 你总会得到 1970-01-01 00:00 对于 0 ,无论服务器处于哪个时区:

    <?php
    date_default_timezone_set('Europe/Berlin');
    
    echo "Europe/Berlin:\n";
    echo "gmdate: ".gmdate('d.m.y H:i', 0) . "\n";
    echo "date: ".date('d.m.y H:i', 0) . "\n";
    
    date_default_timezone_set('America/Los_Angeles');
    
    echo "\nAmerica/Los_Angeles:\n";
    echo "gmdate: ".gmdate('d.m.y H:i', 0) . "\n";
    echo "date: ".date('d.m.y H:i', 0) . "\n";
    
    /* OUTPUT:
    Europe/Berlin:
    gmdate: 01.01.70 00:00
    date: 01.01.70 01:00
    
    America/Los_Angeles:
    gmdate: 01.01.70 00:00
    date: 31.12.69 16:00
    */
    

    https://3v4l.org/FechC

        2
  •  0
  •   Tigger    6 年前

    如果要使用,需要将默认时区设置为GMT date() 像那样。例如:

    date_default_timezone_set('GMT');
    echo date('Y-m-d H:i [I] [e] [O]',0);
    

    上面将显示(无论服务器设置为什么):

    1970-01-01 00:00 [0] [GMT] [+0000]
    

    没有 date_default_timezone_set('GMT') ,甚至开始 Europe/London ,你会在一年中的不同时间得到不同的结果。

    来自PHP手册;

        3
  •  0
  •   Jay Bienvenu    6 年前

    解决方案是获取时区设置,将其放在一边,将时区更改为UTC,执行计算,并将时区重置为其原始设置。

    如果我最初的函数是这样的:

    public function format($argument = null)
    {
      // Perform some calculations involving date() and strtotime().
      return $result;
    }
    

    现在看起来是这样的:

    public function format($argument = null)
    {
      $timezone = date_default_timezone_get();
      date_default_timezone_set('UTC');
      $result = ...; // Perform some calculations involving date() and strtotime().
      date_default_timezone_set($timezone);
      return $result;
    }