在错误的时区进行时间转换



使用 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 上)。

谢谢。

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

相反,您应该停止使用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 时间戳进行操作要详细得多。

使用完整的 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

相关内容

  • 没有找到相关文章

最新更新