strtotime在错误的时区转换

时间:2019-01-16 08:08:09

标签: php strtotime

使用strtotime()转换日期值时,我面临以下问题。 如果我这样做:strtotime('1/1/2019'),输出将是1546293600 -> 31.12.2018 @ 10:00pm (UTC)

  • 如果我这样做:date_default_timezone_get(),则输出为Europe/Bucharest
  • 在我的托管帐户的php.ini文件中,时区设置为date.timezone="Europe/Helsinki"

我有以下两个问题。

  1. 不应date_default_timezone_get()输出配置的内容 在我的托管帐户php.ini文件中? ( date_default_timezone_set()未使用)?
  2. 为什么strtotime()转换结果位于GMT-2时区?它是 我的理解是,如果没有提供时间戳, 转换应在当前时间(应该是 GMT + 2,无论是赫尔辛基还是布加勒斯特)?

如果我执行date_default_timezone_set('UTC'),则strtotime('1/1/2019)的转换结果正确完成(在GMT + 2上)。

谢谢。

2 个答案:

答案 0 :(得分:0)

发生这种情况可能有一些原因,我们不知道原因,因为我们不了解您的应用程序,因为它可能会在运行时更改时区。

相反,您应该停止使用strtotime并使用面向对象的DateTime函数。

使用DateTime可以定义日期及其时区:

// local time
$date = new \DateTimeImmutable('1/1/2019', new \DateTimeZone('Europe/Bucharest'));
echo $date->format('U > d.m.Y (e)') , '<br>';

// convert to UTC
echo $date->setTimeZone(new \DateTimeZone('UTC'))->format('U > d.m.Y (e)');

与对字符串和unix时间戳进行操作相比,该库功能强大且冗长得多。

答案 1 :(得分:0)

使用完整的IS0 8601格式2019-01-01T12:00:00+00:00为功能提供小时和时区。这样,您将获得正确的UTC时间戳。如果您不使用小时,我建议您使用凌晨12点。

在下面的示例中,我将使用数字日期数组来构建此字符串

//   [Y,m,d]
$date = [2019,1,1];
for($i=1; $i<3; $i++){
  $date[$i] = str_pad($date[$i],2,'0',STR_PAD_LEFT);
}
$t1 = strtotime(implode('-',$date).'T12:00:00+00:00');
echo date('r',$t1);
//=>Tue, 01 Jan 2019 12:00:00 +0000