Как разобрать любой формат даты - PullRequest
4 голосов
/ 21 сентября 2011

Я пытаюсь сделать что-то умное, чтобы разобрать дату в любом международном формате.

На своем веб-интерфейсе я использую jquery ui в качестве средства выбора даты, и каждый язык имеет свой определенный формат даты.

Пт: д / м / г En: м / д / г ...

ОК, но теперь в части php я должен сохранить эти даты в том же формате (Mysql Y-m-d). Я хотел бы избежать использования переключателя и тому подобного, поэтому я начал искать другую альтернативу.

Лучшее, что я нашел, это

http://www.php.net/manual/en/datetime.createfromformat.php Эта функция позволит мне разобрать даты, если я знаю формат.

Например

$format = 'Y-m-d';
$date = DateTime::createFromFormat($format, '2009-02-15');

Хорошо, это хорошее начало, но теперь я хотел бы найти стандартный формат даты для текущей локали.

Итак, я нашел это:

http://www.php.net/manual/en/intldateformatter.getpattern.php

Но я действительно не знаю, как заставить это работать, потому что я получаю непроизвольные результаты:

php > $i = new IntlDateFormatter("fr_FR.utf8",IntlDateFormatter::SHORT,IntlDateFormatter::NONE);
php > echo $i->getPattern();
dd/MM/yy
/* correct ! */

но

php > $i = new IntlDateFormatter("en_US.utf8",IntlDateFormatter::SHORT,IntlDateFormatter::NONE);
php > echo $i->getPattern();                                                    
M/d/yy /* wtf */

Я что-то упустил?

Спасибо

1 Ответ

1 голос
/ 22 сентября 2011

Не существует «универсального стандарта символа формата даты».Символ «у» может быть двухзначным годом, четырехзначным годом или даже трехбуквенным сокращенным месяцем (маловероятно) в зависимости от источника.

Символы форматирования для IntlDateFormatterзадокументированы здесь .Как видно из документации, для этой реализации «d» - это дата без начальных нулей, а «dd» содержит ведущие нули.«М» и «ММ» представляют месяц с ведущими нулями.«Yy» - это год, состоящий из двух цифр.

Между этими символами и символами формата даты в пользовательском интерфейсе jQuery достаточно различий, поэтому вам потребуется карта данных для сопоставления символов формата IntlDateFormatter с jQuery.Символы формата DatePicker для пользовательского интерфейса и наоборот.

Что-то вроде этого должно быть достаточным (не проверено):

// PHP => jQuery
$formatMap = array(
    'dd' => 'dd',
    'd'  => 'd',
    'MM' => 'mm',
    'M'  => 'mm',
    'yy' => 'y'
    // and so on...
);

После настройки карты вы можете создать свою IntlDateFormatter на основе локали, преобразуйте символы этого формата в символы формата даты jQuery UI, а затем отправьте формат во внешний интерфейс.

Когда пользователь отправляет обратно выбранную дату, вы можете сделать то же самое в обратном порядке.чтобы вернуться к IntlDateFormatter символам.На этом этапе вы можете использовать комбинацию IntlDateFormatter::setPattern(), чтобы установить формат в стиле MySQL, и datefmt_format() (или эквивалентный), чтобы фактически отформатировать опубликованную дату.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...