Преобразование формата даты PHP в формат даты jQueryUI Datepicker

[РЕДАКТИРОВАТЬ]: Я думаю, у людей была проблема, чтобы понять, что я имею в виду, поэтому полностью переписал свои объяснения.

Я работаю над проектом, в котором пользователи могут определять формат даты, используемый на всем сайте. Он использует стандарт формата даты PHP. Например: "year-month-day" устанавливается "Y-m-d".

Стандарт PHP использует односимвольные символы, такие как Y, m, d, F, j, чтобы описать формат даты. Как видно из документации: http://www.php.net/manual/fr/function.date.php

Иногда пользователи могут выбирать дату благодаря jQueryUI Datepicker. Этот компонент описывает формат даты с кодовыми словами типа yy, y, mm, dd, D,... http://api.jqueryui.com/datepicker/#utility-formatDate

Я хотел бы отображать даты в том же формате как для PHP, так и для Datepicker. Я имею в виду, что PHP должен выводить дату как в формате, заданном пользователем, так и Datepicker должен показывать выбранную дату в в том же формате.

Учитывая, что:

  • Формат даты обязательно описывается "PHP-стиль"
  • Я не знаю априори, какой формат был задан пользователями

/!\Это не проблема того, как читать/анализировать/отображать дату из известного формата.

К сожалению, описание формата даты Javascript не такое же, как в PHP. Например, эти 2 формата даты эквивалентны, но описаны по-разному в PHP и Javascript:

  • PHP: Y-m-d (устанавливается пользователями)
  • Javascript: yy-mm-dd

Как вы можете видеть, я не могу просто настроить datepicker с форматом даты PHP, потому что он будет неправильно понят или вообще не будет распознан.

Кто-то (в ответах ниже) советовал создать мой собственный "стандартный конвертер формата даты", сопоставляя каждый символ PHP с его эквивалентом в описании формата даты JS. Также как:

  • Y = > yy
  • m = > mm
  • d = > dd
  • y = > y
  • z = > o
  • ...

И затем замените каждый символ PHP на JS. И так "d/m/Y" будет волшебным образом переведен на "dd/mm/yy".

Но, может быть, кто-то знает еще один правильный способ сделать jQueryUI Datepicker понятным стандартом даты даты PHP?

EDIT: я написал учебное пособие, в котором объясняются как проблема, так и решение. Для дальнейшего чтения: http://tristan-jahier.fr/blog/2013/08/convertir-un-format-de-date-php-en-format-de-date-jqueryui-datepicker

Ответ 1

Я выбрал жестокий метод: преобразование символа по символу в формат даты. Я сделал фрагмент кода "не так-фиктивный".

/*
 * Matches each symbol of PHP date format standard
 * with jQuery equivalent codeword
 * @author Tristan Jahier
 */
function dateformat_PHP_to_jQueryUI($php_format)
{
    $SYMBOLS_MATCHING = array(
        // Day
        'd' => 'dd',
        'D' => 'D',
        'j' => 'd',
        'l' => 'DD',
        'N' => '',
        'S' => '',
        'w' => '',
        'z' => 'o',
        // Week
        'W' => '',
        // Month
        'F' => 'MM',
        'm' => 'mm',
        'M' => 'M',
        'n' => 'm',
        't' => '',
        // Year
        'L' => '',
        'o' => '',
        'Y' => 'yy',
        'y' => 'y',
        // Time
        'a' => '',
        'A' => '',
        'B' => '',
        'g' => '',
        'G' => '',
        'h' => '',
        'H' => '',
        'i' => '',
        's' => '',
        'u' => ''
    );
    $jqueryui_format = "";
    $escaping = false;
    for($i = 0; $i < strlen($php_format); $i++)
    {
        $char = $php_format[$i];
        if($char === '\\') // PHP date format escaping character
        {
            $i++;
            if($escaping) $jqueryui_format .= $php_format[$i];
            else $jqueryui_format .= '\'' . $php_format[$i];
            $escaping = true;
        }
        else
        {
            if($escaping) { $jqueryui_format .= "'"; $escaping = false; }
            if(isset($SYMBOLS_MATCHING[$char]))
                $jqueryui_format .= $SYMBOLS_MATCHING[$char];
            else
                $jqueryui_format .= $char;
        }
    }
    return $jqueryui_format;
}

Эта функция обрабатывает все общие кодовые слова между стандартами формата даты и даты Datepicker.

Кроме того, я добавил поддержку экранирования символов:

d m \o\f Y становится dd mm 'of' yy

У вас могут быть проблемы с символами типа "W", "L", которые не имеют эквивалента, обрабатываемого Datepicker.

Ответ 2

Вы не можете использовать тот же формат с datepicker, который вы используете с PHP.

Поскольку формат даты в формате PHP использует только однобуквенные коды, вам лучше просто взять формат даты PHP и заменить каждый код на соответствующее значение в формате датпикера jQuery, например:

$PHPFormatOptions = array('y', 'Y', 'm', 'd');
$JSFormatOptions = array('yy', 'yyyy', 'mm', 'dd'); // and so on
$JSFormat = str_replace($PHPFormatOptions, $JSFormatOptions, $PHPFormat);

Ответ 3

Не уверен, что я совсем с тобой, но это действительно не должно быть проблемой. Вы можете либо проанализировать входной интерфейс: используя DateTime::createFromFormat cf. php для этого или использовать JSON.
Поскольку JSON имеет стандартный способ форматирования строк даты, вы можете передать JSON-строчную версию входной даты на PHP и json_decode на стороне сервера. Оба этих решения открыты для вас, хотя я считаю, что первый из них будет проще реализовать в вашем случае.

Если вы хотите иметь возможность выбирать формат с обеих сторон, объект DateTime определенно вам нужен:

$date = new DateTime();
echo $date->format('Y-m-d').' <==> '.$date->format('y-M-j');
$postDate = $date->createFromFormat('y-m-d',$_POST['submitDate']);
echo $postDate->format('Y-m-d');

Формат объясняется на странице, с которой я связан.

Ответ 4

Вот решение:

function datepicker_format($format) {
        static $assoc = array(
            'Y' => 'yyyy',
            'y' => 'yy',
            'F' => 'MM',
            'm' => 'mm',
            'l' => 'DD',
            'd' => 'dd',
            'D' => 'D',
            'j' => 'd',
            'M' => 'M',
            'n' => 'm',
            'z' => 'o',
            'N' => '',
            'S' => '',
            'w' => '',
            'W' => '',
            't' => '',
            'L' => '',
            'o' => '',
            'a' => '',
            'A' => '',
            'B' => '',
            'g' => '',
            'G' => '',
            'h' => '',
            'H' => '',
            'i' => '',
            's' => '',
            'u' => ''
        );

        $keys = array_keys($assoc);

        $indeces = array_map(function($index) {
            return '{{' . $index . '}}';
        }, array_keys($keys));

        $format = str_replace($keys, $indeces, $format);

        return str_replace($indeces, $assoc, $format);
    }

Волшебный двойной вызов str_replace, вызванный дублированием в иглах и его значениями замены, поэтому, почему строка

m/d/Y 

становится

{{3}}/{{5}}/{{1}}

после чего эти гнезда заменяются фактическими значениями замены:

mm/dd/yy

Ответ 5

Хорошо, поэтому лучшим решением для вас было бы хранить все на своем сайте с помощью time();

Насколько я знаю, datepicker может быть настроен на работу с датами для метки времени PHP

dateFormat : 'yy-mm-dd',

Изменить:

Зачем вам хранить дату, например: Y-m-d? Он должен храниться как timestamp или int