Как изменить строку даты (j FY) на дату (Ymd) - PullRequest
0 голосов
/ 03 октября 2019

У меня есть дата в строке, как 7 october 2019, но на польском 7 sierpnia 2019, и я хотел бы изменить ее на дату (Гм)

Я сделал:

$day = '7 sierpnia 2019';
setlocale( LC_TIME, array('pl_PL.UTF-8','pl_PL@euro', 'pl_PL', 'polish'));
$date = DateTime::createFromFormat( 'j F Y', $day);
echo $date->format( 'Y-m-d');

но яполучил эту ошибку:

Fatal error: Call to a member function format() on boolean

Мне нужно вставить его в БД в формате Y-m-d.

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Более общее решение с IntlDateFormatter . Требуется установленное расширение intl (т.е. sudo apt-get install php-intl для Debian / Ubuntu).

<?php

$day = '7 sierpnia 2019';
$formatter = new IntlDateFormatter('pl_PL', null, null);
$formatter->setPattern('d M yyyy');
echo (new DateTime('@' . $formatter->parse($day)))->format('Y-m-d');
0 голосов
/ 03 октября 2019

Не уверен, что этого достаточно для вашего варианта использования, но в приведенном ниже коде показан способ сначала перевести названия польских месяцев (предполагаемое полное имя) на английский, а затем выполнить преобразование даты ( sandbox demo ):

<?php

$day = '7 sierpnia 2019';
$effective_day = preg_replace_callback('/(\s+)((stycz|lut|mar|kwie|maj|czerw|lip|sierp|wrzes|pazdzier|listopad|grud).*?)(\s+)/i', function ($matches) {
        switch ($matches[3]) {
        case 'stycz':
                return 'January';
        case 'lut':
                return 'February';
        case 'mar':
                return 'March';
        case 'kwie':
                return 'April';
        case 'maj':
                return 'May';
        case 'czerw':
                return 'June';
        case 'lip':
                return 'July';
        case 'sierp':
                return 'August';
        case 'wrzes':
                return 'September';
        case 'pazdzier':
                return 'October';
        case 'listopad':
                return 'November';
        case 'grud':
                return 'December';
        }
        return $matches[0];
}, $day);
$date = DateTime::createFromFormat('j F Y', $effective_day);
echo $date->format( 'Y-m-d');

Ссылка: https://www.ics.uci.edu/~dan/genealogy/Miller/resource/polmonth.htm

...