使用strtotime()转换日期值时,我面临以下问题。
如果我这样做:strtotime('1/1/2019')
,输出将是1546293600 -> 31.12.2018 @ 10:00pm (UTC)
date_default_timezone_get()
,则输出为Europe/Bucharest
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上)。
谢谢。
答案 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