我对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。
有人知道为什么会这样吗?
答案 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则会中断的原因)。
答案 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();