当使用parse()
解析ISO-8601datetime时,Carbon在使用toDateTimeString()
时不读取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'
转储
// 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)
发布于 2018-09-05 07:50:30
我不确定您认为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方法,这3个实例将输出相同的数字。两者都不会在输出时更改时区。
如果您想输出一个UTC时间戳,请在输出之前使用setTimezone方法转换其他实例的时区。
$dateWithOffset->setTimezone('UTC')->toDateTimeString()
https://stackoverflow.com/questions/52174691
复制相似问题