当W3c转换为DateTimeString时,Carbon不会占用PHP时区

问题描述 投票:0回答:1

当使用parse()解析ISO-8601 datetime时,当使用toDateTimeString()时,Carbon不会读取PHP时区(例如,对于MySQL)。检查下一个代码:

$date_with_tz = '2018-09-04T19:12:34-04:00';
echo Carbon::parse($date_with_tz)->toW3cString().PHP_EOL;
echo Carbon::parse($date_with_tz)->toDateTimeString().PHP_EOL;
$date_with_tz = '2018-09-04T19:12:34-03:00';
echo Carbon::parse($date_with_tz)->toW3cString().PHP_EOL;
echo Carbon::parse($date_with_tz)->toDateTimeString().PHP_EOL;

[php.date_timezone ='America / Argentina / Mendoza']( - 03:00)

倾倒

// 2018-09-04T19:12:34-04:00
// 2018-09-04 19:12:34
// 2018-09-04T19:12:34-03:00
// 2018-09-04 19:12:34         <-- Wrong

预期

// 2018-09-04T19:12:34-04:00
// 2018-09-04 19:12:34
// 2018-09-04T19:12:34-03:00
// 2018-09-04 20:12:34         <-- OK (expected)
laravel php-carbon
1个回答
0
投票

我不确定你认为date_default_timezone_set应该在这里做什么,但它不会改变DateTime或Carbon实例的时区,如果没有提供,它只是默认值。

date_default_timezone_set('UTC');

// -03:00 (provided via offset in date format)
$dateWithOffset = Carbon::parse('2018-09-04T19:12:34-03:00'); // -03:00

// -04:00 (provided via timezone parameter)
$dateWithTZ = Carbon::parse('2018-09-04T19:12:34', 'America/New_York');

// 00:00 (this is the only one affected by the default setting since no offset or timezone was provided)
$dateWithoutOffset = Carbon::parse('2018-09-04T19:12:34');

如果您要使用format或toDateTimeString方法,这三个实例将输出相同的数字。在输出时也不会改变时区。

如果要输出UTC时间戳,请使用setTimezone方法在输出之前转换其他实例的时区。

$dateWithOffset->setTimezone('UTC')->toDateTimeString()
© www.soinside.com 2019 - 2024. All rights reserved.