我正在使用CodeIgniter(PHP 7.1.1)开发一个网站,在客户端,我需要向服务器发送一些日期:
var date_str = date.toLocaleDateString();
var time_str = date.toLocaleTimeString().split(':');
time_str = time_str[0] + ':' + time_str[1];
...
data_to_ajax = {
date: inicio,
date2: termino
};
...
服务器将使用以下方式验证这些日期:
DateTime::createFromFormat('d/m/Y H:i', $date);
DateTime::createFromFormat('d/m/Y H:i', $date2);
它工作正常,除非使用microsoft Edge,createFromFormat
将始终为发送日期返回false。要调试我发送的日期var_dump
,我得到的是:
string(43) "29/08/2017 21:00"
string(31) "29/08/2017 23:30"
在chrome和mozilla中,我得到的是:
string(16) "29/08/2017 21:00"
string(16) "29/08/2017 23:30"
好吧,调试发送的http正文数据,chrome和mozilla将发送63个字节:
date_loc=29%2F08%2F2017+21%3A00&date_ter=29%2F08%2F2017+23%3A30
边缘发送189(63 * 3)字节:
date_loc=%E2%80%8E28%E2%80%8E%2F%E2%80%8E08%E2%80%8E%2F%E2%80%8E2017+%E2%80%8E21%E2%80%8E%3A%E2%80%8E00%E2%80%8E&date_ter=%E2%80%8E28%E2%80%8E%2F%E2%80%8E08%E2%80%8E%2F%E2%80%8E2017+23%3A30
两者似乎都是正确的,因为:url encoder/decoder可以解码它们,问题似乎与服务器有关,为什么php会显示具有相同字符数的两个字符串具有不同的长度? var_dump
可以正常显示这些字符串更奇怪,但createDateFromFormat
将失败。
答案 0 :(得分:1)
Microsoft Edge将%E2%80%8E
放入发送的数据中,这是一个Left-to-right mark,这会导致php函数出现问题:createDateFromFormat
,因为Edge发送的字符串&#39} ; t符合指定的格式:d/m/Y H:i
,你可以做的是使用格式字符串中的*
(doc)字符:*d*/*m*/*Y *H*:*i*
或者你可以删除所有使用:
$date = preg_replace('/[^\PC\s]/u', '', $date);