Нет, вы не можете добавлять новые сокращения часовых поясов к PHP. PHP получает эти часовые пояса из встроенной базы данных часовых поясов, которая основана на базе данных Олсона .
Однако вы можете предоставлять литералы в DateTime::createFromFormat
, экранируя их с помощью обратного слэса. sh символ. Так что в вашем случае вам нужно будет установить часовой пояс вручную, если он потерпит неудачу. Вы можете проверить, не совпадает ли сокращение часового пояса в базе данных, используя DateTimezone::listAbbreviations()
.
Вот пример ...
$defaultTZ = null;
$tzString = "2019-11-13 00:52:03 BRT";
$tzs = implode('|', array_keys(DateTimeZone::listAbbreviations()));
if (!preg_match("/(?: )(" . $tzs . ")$/i", $tzString)) {
if (preg_match("/(?: )([A-Z]{3,4})$/", $tzString, $match)) {
$tzAbr = "\\" . implode("\\", str_split($match[1]));
$defaultTZ = new DateTimezone("America/Sao_Paulo");
} else {
// ohnoes something went horribly wrong
}
} else {
$tzAbr = "T";
}
$date = DateTime::createFromFormat("Y-m-d H:i:s $tzAbr", $tzString, $defaultTZ);
var_dump($date);
Что дает вам ...
object(DateTime)#2 (3) {
["date"]=>
string(26) "2019-11-13 00:52:03.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(17) "America/Sao_Paulo"
}
Вам нужно будет разработать свой собственный лог c для обработки неопределенных часовых поясов, но это должно дать вам представление о том, как действовать дальше.