2011-10-21 56 views
0

我想解析日期字符串,而不必操纵字符串,并期望给定的格式。PHP日期 - 字符串到时间戳

我希望我的用户能够输入January 2, 20111-2-11,并且仍然最终以2011-01-02 12:00:00保存在数据库中。

目前,我有这样的到位:

$post_date = date("Y-m-d H:i:s", strtotime(stripslashes($_POST['post_date']))); 

但似乎是的strtotime返回0,因为作为日期时间1969-12-31 17:00:00

我需要做什么改变结束了?


UPDATE

从php.net:

(PHP 4,PHP 5)

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

..我猜不是!


我不是想的strtotime(数组:

if(isset($_POST['post_date'])){ 
       foreach($_POST['post_date'] as $id => $post_date){ 
        print $post_date.'<br />'; 
        if(strlen(trim($post_date)) && $post_date !== 'Date posted'){ 
         $update_data[$id]['post_date'] = date("Y-m-d H:i:s", strtotime(stripslashes($post_date))); 
        } 
       } 
      } 

得到它的工作:

if(isset($_POST['post_date'])){ 
       foreach($_POST['post_date'] as $id => $post_date){ 
        print $post_date.'<br />'; 
        if(strlen(trim($post_date)) && $post_date !== 'Date posted'){ 
         $post_date = str_replace(',', '', $post_date); 
         $post_date = str_replace('-', '/', $post_date); 
         $update_data[$id]['post_date'] = date("Y-m-d H:i:s", strtotime(stripslashes($post_date))); 
        } 
       } 
      } 

由于多个供我删除逗号和替换连字符。正斜杠

+4

什么是$ _POST ['post_date']目前? – genesis

+0

$ _POST ['post_date']实际上是一个数组(更新多个记录),但示例值将是'2012年12月31日' – AVProgrammer

+1

同意创世纪。我只是用PHP5.3测试它,它运行良好。但要记住的一点是,时间通常会将# - # - #读作Year-Month-Date。如果你想要不同的行为,你可能需要先解析它。 – Dan

回答

4

从评论OP表示:

$ _POST [ 'POST_DATE']实际上是(更新多个记录)的阵列, 但示例值将是 '2012年12月31日,'

您不能在strtotime参数中随时间传递逗号,这样做总会返回1970-01-01 00:00:00。你必须删除用户生成的逗号。

$post_date = date("Y-m-d H:i:s", strtotime(stripslashes("1 January 1927 17:59"))); 
echo $post_date; //1927-01-01 17:59:00 
+1

逗号可能会混淆strtotime(),但我不认为它会一直打破它。 – Dan

+0

Downvoter请解释。 – Mob

+1

我没有downvote,但我刚刚测试了strtotime()与'1月2日,2011年',它工作得很好。也许不同的版本,ini,系统等。 – Dan

2

你真的需要关心你的输入,但这里有一个想法。

foreach($_POST['input'] as $userDate) { 
    // strtotime() will assume m/d/y or y-m-d depending on if '-' of '/' is used. 
    $userDate = str_replace('-', '/', $userDate); 
    $post_date = date("Y-m-d H:i:s", strtotime(stripslashes($userDate))); 
} 
+0

++关于输入问题。这是这里的主要事情。 – Mob

+1

不幸的是,strtotime不会假定d-m-y,但实际上会假设y-m-d。 [codepad.org/vbZ0tObH](http://codepad.org/vbZ0tObH) – ghbarratt

+0

你是对的。修复。 – Dan

1

在PHP 5.3.3+(也许是旧版本)

date('Y-m-d', strtotime('January 2, 2011')) 

(注意逗号是存在的)会给你2011-01-02

但是,当您添加小时和分钟来该日期短语的结尾,strtotime DOES返回0。

date('Y-m-d', strtotime('January 2, 2011 14:30')) 

不幸的是给你1970-01-01 00:00:00 注意:http://codepad.org/qgJIJSaw

考虑删除逗号:

$date = str_replace(',', '', $date); 

而且,会的strtotime转换 '1-2-11' 到2001年2月11日( 2001年2月11日),所以你可能需要重新排列数字,如果他们适合的模式,使用类似的东西:

$date = preg_replace('#^([\d]{1,2})-([\d]{1,2})-([\d]{2,4})$#', '$3-$1-$2', $date);