[EDIT]:我猜人们在理解我的意思方面有问题,所以我完全重写了我的解释
我在一个项目中工作,用户可以定义在整个网站中使用的日期格式。它使用PHP日期格式标准。例如:"年-月-日"由"Y-m-d"设置。
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应该以相同的格式显示所选日期。
鉴于:
- 日期格式必须描述为"PHP样式"
- 我无法先验地知道用户设置的格式
/!'这不是一个如何从已知格式读取/解析/显示日期的问题。
不幸的是,Javascript的日期格式描述与PHP中的不一样。例如,这两种日期格式是等价的,但在PHP和Javascript中描述不同:
- PHP: Y-m-d(用户设置) Javascript: yy-mm-dd
正如您所看到的,我不能仅仅用PHP日期格式配置日期选择器,因为它会被误解,或者根本无法识别。
有人(在下面的回答中)建议创建我自己的"日期格式标准转换器",将每个PHP符号与JS日期格式描述中的等效符号相匹配。就像:
- Y =比;yy
- m =比;mm
- 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
我选择了残酷的方法:逐个符号转换日期格式。我做了一个"不那么假"的代码片段。
/*
* 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处理。
你不能使用与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);
我不太同意你的观点,但这真的不应该是个问题。您可以解析前端输入:使用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);
}
神奇的双str_replace调用是由在针中复制它的替换值引起的,所以这就是为什么字符串
m/d/Y
是
{{3}}/{{5}}/{{1}}
之后用实际替换值进行替换:
mm/dd/yy
那么最好的解决方案就是使用time();
将所有内容存储在您的网站中据我所知,datepicker可以设置为使用PHP时间戳的日期
dateFormat : 'yy-mm-dd',
编辑:
为什么要存储这样的日期:Y-m-d ?它应该存储为时间戳或int