2013-04-16 230 views
0

开始时间,结束日期和结束时间变量。开始日期和开始时间小于结束日期和结束时间验证

日期变量被格式化yyyy-mm-dd

的时间变量被格式化hh-mm(但只在小时数字是可用的,例如分钟总是00)

我可以将这些变量到我的数据库没有问题,但是在我之前,我想检查开始日期和时间是否在结束日期和时间之前。我知道如何检查时间是否较早,日期较早,但我无法一起检查时间和日期,我希望得到任何帮助?

$_POST['start_time'] 
$_POST['end_time'] 
$_POST['start_date'] 
$_POST['end_date'] 

是变量和我如何抓住他们。

+1

参考:http://stackoverflow.com/q/3847736/2274209 – saveATcode

+0

也http://stackoverflow.com/q/961074/2274209 – saveATcode

+0

这是什么,我问 – Ryan

回答

3
function getTime ($ymd, $hi) { 
    return strtotime($ymd." ".$hi); 
} 
if (getTime($_POST['start_date'], $_POST['start_time']) < getTime($_POST['end_date'], $_POST['end_time'])) { 
    echo "Ok!"; 
} 

只需将其转换为Unix的时间戳,然后比较。

+0

伟大的完美和简单!对此,我真的非常感激! – Ryan

+0

(我希望你的格式是'hh:mm'而不是'hh-mm';否则你必须在函数中使用'str_replace(“ - ”,“:”,$ hi)' – bwoebi

+2

)我的答案是,如果您使用的是没有DateTime对象的旧PHP版本,我认为这是最好的答案,但我认为最好是@Leonard Challis发布的内容 – Chococroc

0

尝试爆炸数组,然后使用mktime()函数将日期传递给秒。然后,只需比较两个日期,稍后的秒数就越大。

list($strHour, $strMin) = explode('-', $_POST['start_time']); 
list($endHour, $endMin) = explode('-', $_POST['end_time']); 
list($strYear, $strMonth, $strDay) = explode('-', $_POST['start_date']); 
list($endYear, $endMonth, $endDay) = explode('-', $_POST['end_date']); 

$startSeconds = mktime($strHour, $strMin, 0, $strMonth, $strDay, $strYear); 
$endSeconds = mktime($endHour, $endMin, 0, $endMonth, $endDay, $endYear); 

if ($startSeconds > $endSeconds) { 
    echo 'Start is bigger'; 
} 
+0

你能给我一个我将如何使用它的例子吗?在更新 – Ryan

+0

以查看示例之前,我从未使用过mktime()函数。我已经看到了其他答案,如果你可以使用对象作为DateTime,使用它,但首先检查PHP手册中可能出现的问题,因为你使用的PHP版本,因为如果你使用的是旧版本的PHP,也许你没有访问权限(我记得我有一个旧版本,我不能在生产中使用它)。关于strtotime,这是一个非常好的答案,但是您必须非常小心,因为如果您没有使用“正确的格式”,它可能会失败:请检查此答案 - > http://stackoverflow.com/questions/6919478/ph​​p-problem -with-strtotime – Chococroc

2

我会使用DateTime::createFromFormat()它。就像这样:

$start = DateTime::createFromFormat('Y-m-d H-i', 
      $_POST['start_date'] . ' ' . $_POST['start_time']); 
+0

然后我可以比较$ start到$ end为更大? – Ryan

+0

是的,您可以使用带日期时间对象的比较运算符。 – hek2mgl

4

使用DateTime对象,使生活简单的自己:

<?php 
// assuming the following values... 
$_POST['start_time'] = '06:00'; 
$_POST['end_time'] = '10:00'; 
$_POST['start_date'] = '2012-01-01'; 
$_POST['end_date'] = '2013-06-02'; 

//set up two DateTime objects 
$start = DateTime::createFromFormat('Y-m-d H-i', $_POST['start_date'] . ' ' . $_POST['start_time']); 
$end = DateTime::createFromFormat('Y-m-d H-i', $_POST['end_date'] . ' ' . $_POST['end_time']); 

// check if they're valid 
if ($start < $end) { 
    echo 'We are good...'; 
} else { 
    echo 'Something bad happened...'; 
} 

请记住,这里假设你的$_POST ED值有效。如果您尚未将其消毒,请至少将其包装在try/catch中。

+0

开叫者告诉他他有一个输入时间格式hh-mm。有了这个,你的代码将无法工作。这就是原来的问题,我建议使用'DateTime :: createFromFormat()' – hek2mgl

+0

如果他只是添加str_replace(' - ',':',$ _POST ['start_time'])?这样,上面的解决方案是完美的 – Chococroc

+0

好抓@ hek2mgl,欢呼。我正在考虑改变使用str_replace,但我觉得使用'createFromFormat()'更漂亮,更易于阅读。 – LeonardChallis

相关问题