使用 strtotime() 转换日期值时,我遇到了以下问题。如果我这样做:strtotime('1/1/2019')
输出将是1546293600 -> 31.12.2018 @ 10:00pm (UTC)
- 如果我这样做:
date_default_timezone_get()
输出Europe/Bucharest
- 在我的 php.ini 文件中(我的主机帐户),时区设置为
date.timezone="Europe/Helsinki"
我有以下两个问题。
date_default_timezone_get()
不应该输出它的配置内容在我的主机帐户 php.ini 文件中?(的date_default_timezone_set()
未使用)?- 为什么
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