Преобразование формата даты PHP в формат даты jQueryUI Datepicker
[EDIT]: я думаю, у людей были проблемы с пониманием того, что я имею в виду, поэтому я полностью переписал свои объяснения.
Я работаю над проектом, где пользователи могут определить формат даты, используемый в весь сайт. Он использует стандарт формата даты PHP. Например: "год-месяц-день "устанавливается"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 style"
- Я не могу знать априори, какой формат был установлен пользователями
/! Это не проблема того, как читать/анализировать/отображать дату из известного формата.
к сожалению, описание формата даты 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
5 ответов
Я выбрал жестокий метод: преобразование символа по символу в формат даты. Я сделал фрагмент кода "не такой уж и дурацкий".
/*
* 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;
}
эта функция обрабатывает все общие кодовые слова между стандартами формата даты PHP и Datepicker.
кроме того, я добавил поддержку экранирования символов:
d m \o\f Y
становится dd mm 'of' yy
у вас все еще могут быть проблемы с символами, такими как "W", "L", которые не имеют эквивалента, обрабатываемого Datepicker.
вы не можете использовать тот же формат с datepicker, который вы используете с PHP.
поскольку формат даты PHP использует только однобуквенные коды, вам лучше просто взять формат даты PHP и заменить каждый код на соответствующее значение в формате jQuery datepicker, например:
$PHPFormatOptions = array('y', 'Y', 'm', 'd');
$JSFormatOptions = array('yy', 'yyyy', 'mm', 'dd'); // and so on
$JSFormat = str_replace($PHPFormatOptions, $JSFormatOptions, $PHPFormat);
не уверен, что я совсем с вами, но это действительно не должно быть проблемой. Вы могли бы либо анализировать вход переднего плана: использование 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');
формат объясняется на странице, с которой я связан.
вот решение:
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);
}
вызов magic double str_replace, вызванный дублированием в иглах и его значениями замены, поэтому строка
m/d/Y
становится
{{3}}/{{5}}/{{1}}
и после этого это гнездо заменяет фактические значения замены:
mm/dd/yy
Ok поэтому лучшим решением для вас будет хранить все на вашем сайте, используя time ();
насколько я знаю, datepicker можно настроить на работу с датами для PHP timestamp
dateFormat : 'yy-mm-dd',
изменить :
почему вы храните дату как: Y-m-d ? Он должен храниться как timestamp или int