2010-12-17 17 views
0

我有一些数据(由用户insered),如:的MySQL和PHP - 如何将字符串转换为DATETIME

  1. 10-12-2010
  2. XX-12-2010
  3. 10-XX-2010
  4. 10-12-XXXX

(请注意,我加XX(或XXXX),当数据没有insered。)

我怎样才能将这些字符串通过使用MySQL的语法DATETIME

感谢

UPDATE

$day=(is_numeric($_POST['day']) && $_POST['day'] > 0 && $_POST['day'] < 32) ? $_POST['day'] : '00'; 
$month=(is_numeric($_POST['month']) && $_POST['month'] > 0 && $_POST['month'] < 13) ? $_POST['month'] : '00'; 
$year=(is_numeric($_POST['year']) && $_POST['year'] > 1999 && $_POST['year'] < (date("Y")+1)) ? $_POST['year'] : '0000';    
$data=$year."-".$month."-".$day; 
$mysqlDate=date('Y-m-d', strtotime($data)); 
echo $mysqlDate; 

还有一个问题:如果数据是*空-12-2010" ,它打印2010-11-30为什么

+1

你不会得到这样的数据丢失。你可以使用strtotime函数,但是它们不能很好地处理。内置函数都不会猜测缺少的部分是什么。 – profitphp 2010-12-17 15:52:11

+1

您需要解决真正的问题,允许用户输入错误数据 - 强制他们从丢失列表中选择日期是通常的做法。如果你允许文本的自由输入,那么你必须准备好爆炸和分析每个领域。这是可行的,除了你的情况#3 – Cups 2010-12-17 16:04:19

回答

1

如果你确定你不想要求所有日期字段,只需用零填补他们,如果他们不存在,就像这样:

$month = ($_POST['month'] == '') ? '00' : $_POST['month']; 

否则,如果你”再担心不是空白日期,但对非标准输入,你可以这样做:

$month = (is_numeric($_POST['month']) && $_POST['month'] > 0 && $_POST['month'] < 13) ? $_POST['month'] : '00' 

$date = date('Y-m-d G:i:s', strtotime($_POST['dataThatUserEntered']));

应该这样做,不是吗?

只要确保您验证用户输入,否则如果他们进入疯狂的东西,您可能会发现$date = '1970-01-01 00:00:00

+0

检查代码添加为更新:)感谢您的时间 – markzzz 2010-12-17 16:07:38

+0

你不能把''放入mysql,把'00'或'01'。 – JakeParis 2010-12-17 16:11:08

+0

并且不要使用'd-m -Y',mysql的格式是'Y-m-d' – JakeParis 2010-12-17 16:11:55

1

?你可以使用php的strtotime函数。

的strtotime - 解析任何英文 文本的日期时间描述成 Unix时间戳

您应该检查出来的那种格式的你可以用它来工作,你的字符串。

0

Mysql会自动进行转换。你可以看到被接受的格式here。但你应该知道xxx并强制这些字段。

0

那么,你可以使用date(),使用格式和字符串。

$mysqlDate = date('Y-m-d', $stringDate); 
+0

严格它不工作... – markzzz 2010-12-17 16:03:18

+0

第二个参数必须是一个时间戳而不是一个字符串。见http://php.net/manual/en/function.date.php – PiTheNumber 2012-08-01 13:01:18

1

还有一个问题:如果数据是*空-12-2010" 它打印2010- 11-30。

为什么? 因为str totime的读数为00-12-2010,因为它不存在,所以它将它转换为12月1日之前的一天,数字为Dec 01,或者在11月30日重新生成!

+0

哦!我不会检查每一天/每月/每年......这是浪费工作呃!任何修改来解决这个问题? – markzzz 2010-12-17 16:27:35

+0

首先,不要让空洞的时间到达strtotime。用01替代数据,然后到达时间 – JakeParis 2010-12-17 16:29:53

+0

严正,但事实上,如果这是一个真实的数据,我不可能知道。 – markzzz 2010-12-17 16:33:36