- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
bin/magento cron:run gives error in IntlDateFormatter
Just installed Magento 2.2.2 into a new folder on the server. Everything has fired up as expected except for one of the cron jobs. When I run the cron job bin/magento cron:run (with all the correct parameters etc as per the documentation) it gives the error [Exception]
Warning: IntlDateFormatter:arse(): Date parsing failed in /home/sites/3b/6/6bfe122699/public_html/vendor/magento/framework/Stdlib/DateTime/Timezone.php on line 177
Any ideas how I fix this?
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: bin/magento cron:run gives error in IntlDateFormatter
Hi @MillTech,
Can you check if you php configuration is the same for CLI and webserver?
Also, the defautl timezone is properly configured?
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: bin/magento cron:run gives error in IntlDateFormatter
As far as I can tell, the php config is the same for CLI and webserver.
When you talk about the default timezone, is this Magento's or the web server's timezone?
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: bin/magento cron:run gives error in IntlDateFormatter
I'm really confused what is happening here.
When I run the cron job bin/magento cron:run it still gives me the parse error. So, I added some echo statements into the Timezone.php script to try and see what was happening.
The line it fails on is in this function
public function date($date = null, $locale = null, $useTimezone = true, $includeTime = true)
{
$locale = $locale ?: $this->_localeResolver->getLocale();
$timezone = $useTimezone
? $this->getConfigTimezone()
: date_default_timezone_get();
switch (true) {
case (empty($date)):
return new \DateTime('now', new \DateTimeZone($timezone));
case ($date instanceof \DateTime):
return $date->setTimezone(new \DateTimeZone($timezone));
case ($date instanceof \DateTimeImmutable):
return new \DateTime($date->format('Y-m-d H:i:s'), $date->getTimezone());
case (!is_numeric($date)):
$timeType = $includeTime ? \IntlDateFormatter:HORT : \IntlDateFormatter::NONE;
$formatter = new \IntlDateFormatter(
$locale,
\IntlDateFormatter:HORT,
$timeType,
new \DateTimeZone($timezone)
);
echo $locale.'<br/>';
echo $timeType.'<br/>';
echo (new \DateTime($date))->getTimestamp();
$date = $formatter->parse($date) ?: (new \DateTime($date))->getTimestamp();
break;
}
$locale gives en_GB which seems correct
$timeType gives the value 3
The echo from getTimetamp line gives 1515085680
This all seems fine to me so I took that bit of code and put it into a separate php file
<?php
$formatter = new \IntlDateFormatter(
'en_GB',
\IntlDateFormatter:HORT,
3,
new \DateTimeZone(date_default_timezone_get())
);
$date = $formatter->parse($date) ?: (new \DateTime($date))->getTimestamp();
echo $date;
and ran it.
I got the result for $date of 1515086227
That all seems to be okay, there were no errors so why on earth is the cron job producing errors?
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: bin/magento cron:run gives error in IntlDateFormatter
I'm out of ideas. I'm using Magento 2.2.2 and I don't get that error.
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: bin/magento cron:run gives error in IntlDateFormatter
I've had a tinker with Timezone.php.
I have found that changing the line reading:
$date = $formatter->parse($date) ?: (new \DateTime($date))->getTimestamp();
to:
$date = (new \DateTime($date))->getTimestamp();
solves the problem.
It appears that $formatter->parse($date) is not returning a value. I do not know why.
Is my fix safe?
Thanks.
Ronnie
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: bin/magento cron:run gives error in IntlDateFormatter
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: bin/magento cron:run gives error in IntlDateFormatter
I am getting the same problem with 2.2.3 and after upgrading to 2.2.4.
Ronnie
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: bin/magento cron:run gives error in IntlDateFormatter
Hi @ronnie_davies,
I guess you'll find this link useful: https://github.com/magento/magento2/issues/10663
It seems is an open issue. Maybe you con participate there and contribute in order to help to solve it.
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: bin/magento cron:run gives error in IntlDateFormatter
This happened because the PHP Intl extension isn’t installed or enabled.
Please make sure php_intl extension installed on the server and let me know.
If not installed then please follow below steps to install it.
Solutions For Linux-based Server (assuming you have root access):
- Make sure the php_intl.so file exists within your php extensions directory, find the extensions directory by:
- using phpinfo()
- running this command: php -r “echo ini_get(‘extension_dir’);
- (note: both options gets the extension_dir right from the PHP runtime configuration)
- If the file exists:
- search for the config file (php.ini, usually /etc/php.ini) and open it
- Make sure the line “extension=php_intl.so” is existing and not commented
- Restart the web server (usually sudo service httpd restart)
- Check if the extension is enabled using phpinfo()
- If the file doesn’t exist
- Check your php version by running the “php -v” command
- For PHP 5 install the php-intl package using your package manager – package managers and commands
- Most common: apt-get install php-intl (for ubuntu-based linux) or yum install php-intl (for CentOS)
- For PHP 7, install the php7.x-intl (depending on your php version)
- Repeat the steps for the case in which the file exists
For projects hosted on a shared hosting platform you must ask your hosting provider to install/enable the PHP Intl extension.
For Windows-based Server:
- Make sure the php_intl.dll file exists within your php extensions directory
- for separately installed PHP: C:\path\to\php\ext\
- for xampp: C:\path\to\xampp\php\ext
- (note: your drive letter might be different)
- If the file exists:
- search for the config file (php.ini, usually in the same folder as the php executable) and open it
- Make sure the line “extension=php_intl.dll” is existing and not commented
- Restart the web server (usually apache)
- Check if the extension is enabled using phpinfo()
- If the file doesn’t exist:
- Check your php version by running the “php -v” command
- Download the PHP version that corresponds to yours from the PHP Downloads Page (TS/NTS, x86/x64)
- To find thread safety for php, run: php -i | findstr “Thread” , source & more info.
- To find thread safety for php, run: php -i | findstr “Thread” , source & more info.
- Search for the php_intl.dll file in the ext folder in that version and copy it in your php\ext folder
- Repeat the steps for the case in which the file exists
Edit: changed php7.0 occurrences with php7.x as the version may vary.
--
If you've found one of my answers useful, please give "Kudos" or "Accept as Solution"