14

[编辑]:我想人们很难理解我的意思,所以我完全重写了我的解释。

我在一个项目中工作,用户可以定义整个站点中使用的日期格式。它使用 PHP 日期格式标准。例如:“年-月-日”由“Ymd”设置。

PHP 标准使用Y、m、d、F、j等单字符符号来描述日期格式。如文档中所示:http ://www.php.net/manual/en/function.date.php

借助 jQueryUI Datepicker,有时用户可以选择日期。该组件使用yy、y、mm、dd、D 等代码字描述其日期格式... http://api.jqueryui.com/datepicker/#utility-formatDate

我想为 PHP 和 Datepicker 以相同的格式显示日期。我的意思是 PHP 应该以用户设置的格式输出日期,并且 Datepicker 应该以相同的格式显示所选日期。

鉴于:

  1. 日期格式必然描述为“PHP风格”
  2. 我无法先验地知道用户设置了哪种格式

/!\ 这不是如何从已知格式读取/解析/显示日期的问题。

不幸的是,Javascript 日期格式描述与 PHP 中的不同。例如,这两种日期格式是等效的,但在 PHP 和 Javascript 中的描述不同:

  1. PHP : Ymd (由用户设置)
  2. Javascript : 年月日日

如您所见,我不能只用 PHP 日期格式配置 datepicker,因为它会被误解,或者根本无法识别。

有人(在下面的答案中)建议创建我自己的“日期格式标准转换器”,将每个 PHP 符号与其在 JS 日期格式描述中的等价物匹配。就像:

  • Y => 年
  • 米 => 毫米
  • d => dd
  • y => y
  • z => o
  • ...

然后将每个 PHP 符号替换为 JS 符号。所以“d/m/Y”会神奇地翻译成“dd/mm/yy”。

但也许有人知道另一种使 jQueryUI Datepicker 理解 PHP 日期格式标准的正确方法?

编辑:我写了一个教程来解释问题和解决方案。进一步阅读:http ://tristan-jahier.fr/blog/2013/08/convertir-un-format-de-date-php-en-format-de-date-jqueryui-datepicker

4

5 回答 5

34

我选择了残酷的方法:逐个符号转换日期格式。我制作了一个“不那么假”的代码片段。

/*
 * 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

您可能仍然对 Datepicker 无法处理的“W”、“L”等符号有问题。

于 2013-05-23T23:03:46.593 回答
4

您不能使用与 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);
于 2013-05-22T22:20:17.753 回答
1

不确定我是否完全同意你,但这真的不应该是一个问题。您可以解析前端输入:使用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');

格式在我链接到的页面上进行了说明。

于 2013-05-22T22:38:31.550 回答
1

这是解决方案:

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
于 2017-03-19T12:22:20.230 回答
-3

好的,所以对您来说最好的解决方案是使用 time() 将所有内容存储在您的网站中;

据我所知 datepicker 可以设置为使用 PHP 时间戳的日期

dateFormat : 'yy-mm-dd',

编辑 :

你为什么要存储这样的日期: Ymd ?它应该存储为时间戳或整数

于 2013-05-22T23:26:57.857 回答