我的代码与strtotime的奇怪行为

时间:2011-04-08 16:08:16

标签: php datepicker

我对PHP的日期感到头疼。我从表单中获取一些数据并试图通过ajax调用“提交”它来更新网页而不重新加载页面。

我有一个允许选择一系列日期的日期选择器,所以,我已经完成了一个脏函数来分隔开始日期和结束日期,并将它单独发布到PHP(如果选择了一系列日期)。它们以这种方式形成:01/04 / 2011,08 / 04/2011

在PHP中,我有日期变量并尝试格式化它们以这种方式执行一些数据库查询:

$date_start = $_POST['date_start'];
$date_start_form = date("Y-m-d",  strtotime($date_start));

经过一些测试后,我发现如果日期高于第12天的任何一个月,然后尝试格式化它,它会让我回到1970-01-01。

有人知道为什么会这样吗?

6 个答案:

答案 0 :(得分:2)

顺便说一句,解决问题的方法是不使用/作为日期分隔符,if - 或。如使用08.04.2011或08-04-2011,则假定欧洲方法正在使用中。

如果您只能收到08/04/2011格式的日期,那么简单的str_replace将会处理它:

$date = "08/04/2011";
$date = str_replace('/','.',$date); //08.04.2011
echo date('Y-m-d',strtotime($date));  //2011-04-08

答案 1 :(得分:1)

  

它们以这种方式形成:01/04 / 2011,08 / 04/2011

这可能是你的问题:如果这些日期是在4月份,那么你正在使用欧洲的写日期方式。 strtotime期望美国约会,所以它可能将月份解释为当天和月份的日期(这也是为什么如果日期大于12则会中断的原因)。

维基百科:Date and time notation in the United States

答案 2 :(得分:0)

听起来你有白天和月份混淆了。当你把它们送到strtotime()时,它期望月份是第二个数字,而不是第一个。

答案 3 :(得分:0)

据我所知,strptime是唯一一个接受日期作为字符串的php函数,以及日期格式,然后使用返回的数组生成时间戳。

例如:

$timeArr = strptime($date_start ,"DD/MM/YY");
$timestamp = mktime(0, 0, 0, $timeArr['tm_mon']+1, $timeArr['tm_mday'], $timeArr['tm_year']);
$date_start_form = date("Y-m-d", $timestamp);

或者您可以直接构建字符串,例如:

$timeArr = strptime($date_start ,"DD/MM/YY");
$date_start_form = sprintf(%d-%d-%d, $timeArr['tm_year'], $timeArr['tm_mon']+1, $timeArr['tm_mday']);

虽然考虑到这一点,你可以将接收日期视为需要重新排列的字符串,并忽略它作为日期的事实,例如:

$timeArr = explode($date_start ,"/");
$date_start_form = sprintf(%d-%d-%d, $timeArr[2], $timeArr[1], $timeArr[0]);

答案 4 :(得分:0)

这是时区问题。 strtotime考虑到了这一点。您可以使用

设置正确的一个
date_default_timezone_set('Europe/London');

或在strtotime之前的任何一个电话。请参阅list of supported timezones

答案 5 :(得分:0)

如果您使用php => 5.3,则可能需要查看DateTime::createFromFormat函数。 对于您的情况,它可以实现如下:

$date = "08/04/2011";
$date_object = DateTime::createFromFormat('d/m/y', $date);
$timestamp = $date_object->getTimestamp();