Reputation: 181
I am trying to run this script:
<?php
$d = new DateTime('now', new DateTimeZone('Asia/Kolkata'));
$time = $d->format('H:i');
echo $time;
?>
but I got this error:
Fatal error: Uncaught exception 'Exception' with message 'DateTimeZone::__construct() [<a href='function.DateTimeZone---construct'>function.DateTimeZone---construct</a>]: Unknown or bad timezone (Asia/Kolkata)
Though it works well for Asia/Dacca
for example. What could be the problem and how to fix it?
Upvotes: 18
Views: 54345
Reputation: 1555
The error may come from certain versions of Carbon itself which uses PHP functions DateTimeZone::listAbbreviations
and timezone_open
, and the former may include zones not supported by the latter in certain environments.
// "nesbot/carbon" PHP package (v2.72.1)
protected static function getDateTimeZoneFromName(&$name)
{
return @timezone_open($name = (string) static::getDateTimeZoneNameFromMixed($name));
}
// ...
public function getAbbreviatedName($dst = false)
{
$name = $this->getName();
foreach ($this->listAbbreviations() as $abbreviation => $zones) {
foreach ($zones as $zone) {
if ($zone['timezone_id'] === $name && $zone['dst'] == $dst) {
return $abbreviation;
}
}
}
return 'unknown';
}
// ...
public static function instance($object = null, $objectDump = null)
{
// ...
if (Carbon::isStrictModeEnabled()) {
throw new InvalidTimeZoneException('Unknown or bad timezone ('.($objectDump ?: $object).')');
}
return false;
}
The above Carbon technique, in turn, may process possibly deprecated timezones which are expected to be aliased but may be missing in places Carbon expects those to see. For example, Kiev
and Kyiv
:
[tz-announce] 2022b release of tz code and data available
Paul Eggert eggert at cs.ucla.edu
Thu Aug 11 00:36:51 UTC 2022
...
- Rename Europe/Kiev to Europe/Kyiv.
$ php -r 'var_dump(timezone_open("Europe/Kiev"));';
PHP Warning: timezone_open(): Unknown or bad timezone (Europe/Kiev) in Command line code on line 1
bool(false)
$ NO_COLOR=1 ./artisan tinker --execute 'dump((string) now("Europe/Kiev"))';
Carbon\Exceptions\InvalidFormatException Unknown or bad timezone (Europe/Kiev).
Let's install Debian package tzdata-legacy.
$ php -r 'var_dump(timezone_open("Europe/Kiev"));';
object(DateTimeZone)#1 (2) {
["timezone_type"]=>
int(3)
["timezone"]=>
string(11) "Europe/Kiev"
}
$ NO_COLOR=1 ./artisan tinker --execute 'dump((string) now("Europe/Kiev"))';
"2025-02-07 13:55:22"
Upvotes: 0
Reputation: 576
You are using an old database with a list of timezones, upgrade it via pecl. The latest version of the timezone database can be installed via PECL -timezonedb
.
pecl upgrade timezonedb OR pecl install timezonedb
Upvotes: 0
Reputation: 1295
I've got same problem when try to run webserver in CHROOT jail. In this case chrooted dir can not contain Linux timezone files. If it's your case and you have access to webserver files simple copy all files to chroot jail:
For CentOS it's
cp -R /usr/share/zoneinfo/ /MY_CHROOT_DIR/usr/share/
Upvotes: 4
Reputation: 11394
PHP timezone database has been updated in version 5.3. Try installing that and try again
Upvotes: -1
Reputation: 27866
Try this for fun.
$timezones = array('Europe/London', 'Mars/Phobos', 'Asia/Kolkata');
foreach ($timezones as $tz) {
try {
$mars = new DateTimeZone($tz);
} catch(Exception $e) {
echo $e->getMessage() . '<br />';
}
}
Upvotes: 3
Reputation: 44346
And welcome to StackOverflow! If you haven't already make some time to read the FAQ.
I tried your example and it worked for me with PHP 5.3.1 and "Olson" Timezone Database Version 2009.18 .
You should do a phpinfo()
and see what time zone DB version you have and if it's older update it. You can see in this list that the most recent version, 2011.1, has Asia/Kolkata.
Upvotes: 4