在PHP中更改日期格式

6

我正在开发一个网页,在其中需要将日期格式从22/01/2010更改为2010-01-22。我使用了以下函数,但是收到了警告:“Deprecated: Function ereg() is deprecated in c:\wamp\www\testpage.php on line 33”。是否有隐藏此错误的方法或其他更改日期格式的方法?请帮助我解决这个问题。提前致谢。

$datedue = $_REQUEST['txtJoiningdate'];
        $r = ereg ("([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})", $datedue, $redgs);
        $billdate=$redgs[3]."-".$redgs[2]."-".$redgs[1];

点击此处获取有关日期不同格式/选项的信息:http://php.net/manual/zh/function.date.php - Floccinaucinihilipilification.
8个回答

11
为什么不使用 PHP 中本身就带有的 strtotime、date 和 str_replace 函数来在一行代码中完成操作呢?这样做可以方便地使用 date 提供的众多选项轻松更改日期格式。
echo date('Y-m-d',strtotime(str_replace("/",".","22/01/2010")));

输出 2010-01-22

使用的函数文档:


7

您正在使用已弃用的函数。请改用preg_match。此外,对preg_match的调用应该在if测试中。

<?php
$datedue = '22/01/2010';
if(preg_match('@([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})@', $datedue, $redgs)) {
    $billdate=$redgs[3]."-".$redgs[2]."-".$redgs[1];    
    echo $billdate; // prints  2010-01-22 
}
?>

3
这应该可以解决问题:
list($d, $m, $y) = explode('/', $datedue);
$billdate = date('Y-m-d', mktime(0,0,0,$m,$d,$y);

或者,如Gumbo所建议的那样,这可以不使用日期函数:
list($d, $m, $y) = explode('/', $datedue);
$billdate = "$y-$m-$d"; 

我建议使用date,因为如果你将来需要更改格式,就不需要使用正则表达式进行简单的拆分。在这种情况下,使用Explode会更快。 ereg_正则表达式函数已经从PHP 5.3.0开始被弃用,并将在PHP 6中被删除。对于正则表达式,请使用preg_函数。
关于隐藏错误;在开发过程中,您永远不应该隐藏通知,因为它们可以帮助您构建更好的代码。没有那个通知,您将愉快地使用ereg,当服务器更新到PHP 6时,您的应用程序将会严重破坏。但是,您可以通过error_reporting()控制显示的错误量。在您的网站上线后关闭error_reporting可能是一个好主意。
顺便说一句,如果您觉得某些答案有帮助,请开始接受它们。

1
不需要使用datemktime,简单的字符串处理就足够了。 - Gumbo
@Gumbo,使用日期(就像我建议的那样)可以提供更多灵活性,在未来的时间内更改日期格式而无需重新排序或重新处理字符串。 - johnnyArt

3
请使用PCRE函数中的preg_matchpreg_replace代替:
$billdate = preg_replace('~([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})~', '$3-$2-$1', $datedue);

但是您还可以使用 explodearray_reverseimplode 的组合:

$billdate = implode('-', array_reverse(explode('/', $datedue)));

3

最近版本的PHP已经不再推荐使用POSIX正则表达式函数,您应该停止使用它们,改用preg_*函数。


以下是使用preg_match重写的代码:

preg_match("#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})#", '22/01/2010', $redgs);
$billdate=$redgs[3]."-".$redgs[2]."-".$redgs[1];
var_dump($billdate);

你将会得到:

$ /usr/local/php-5.3/bin/php temp.php
string(10) "2010-01-22"


更加精确地说,引用 ereg 的文档:

从 PHP 5.3.0 开始,该函数已被弃用,并且在 PHP 6.0.0 中被移除。依赖此功能不建议使用

因此,请毫不犹豫地阅读 正则表达式(Perl 兼容) 的文档 -- 它们比 POSIX 更强大、更快速。


1
<?php
list($day, $month, $year) = split('/', $_REQUEST['txtJoiningdate']); // 22/01/2010
$new_date = "$year-$month-$day"; // $new_date now equals 2010-01-22
?>

1
$date = '01/24/2006'; 
echo date('Y-m-d', strtotime($date)); // outputs 2006-01-24  

0
if ( ! function_exists('changeDateFormat'))
{
    function changeDateFormat($original)
    {
        //$original = '2015-08-10';
        //  2015-08-10 to 10-08-2015
        $exploded = explode("-", $original);
        $exploded = array_reverse($exploded);
        $newFormat = implode("-", $exploded);
        return $newFormat;
    }
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接