将日期格式从dd/mm/yyyy转换为yyyy-mm-dd PHP

13

我有一个表单,其中输入的日期格式为英国格式,我需要将其转换为

yyyy-mm-dd

例如,输入的日期是:31/03/2013,我想将其转换为'2013-03-31'以进行数据库插入。

我正在使用以下代码,但令人惊奇的是它有时候只能工作:

$dateInput = $mysqli->real_escape_string($_POST['date']);
$show_date = date('Y-m-d', strtotime($dateInput));

有没有更好的方法来做这件事?


你为什么要转义日期值...这样做确实有任何意义吗? - Mark Baker
这种情况何时无法正常工作?此外,似乎转义不是一个好主意(或者至少在日期格式正确的情况下似乎是没有用的)。也许你应该考虑使用正则表达式来检查初始格式。 - ulentini
1
@Darren,这个有时候不起作用的原因是因为PHP期望日期以美国格式呈现。在将其交给strtotime()之前,您必须重新排列它(如果需要)。https://dev59.com/P2855IYBdhLWcg3wvnOE - Tushar
@Uby 我转义所有内容,以防某些****尝试注入。 - StudioTime
1
@Darren - 在这种情况下是多余的,因为您正在将字符串转换为日期时间序列化,然后再次转换回来 - 您有控制权...如果您认为可能会注入某些内容,则转义并不完全符合您的预期。 - Mark Baker
显示剩余2条评论
7个回答

20

这个想法不错,但是date_parse_from_format返回的是array,而date函数需要一个整数作为第二个输入。 - Voitcus
哦,抱歉,你已经编辑过了。 - Voitcus
@Voitcus 是的,我发完答案后才注意到这个问题。 - sroes
1
注意(这是一个重要的注意事项):仅适用于PHP 5.3.0及更高版本! - Tushar
@Tushar 没关系,现在是2018年了 :) - John Hunt

11

试一下。

$dateInput = explode('/','31/03/2013');
$ukDate = $dateInput[2].'-'.$dateInput[1].'-'.$dateInput[0];

抢我的风头了。我用 preg_replace 做了一个不同的(一行代码)。 - AbsoluteƵERØ
你也可以使用字符串数组表示法而不需要使用任何函数(如explode)来完成这个任务。 - AbsoluteƵERØ

3
以下方法有时候奇怪地有效:
$show_date = date('Y-m-d', strtotime($dateInput));

没有比这更短的方法来完成它......我一直使用这种方法,直到现在,没有发现任何奇怪的事情发生.....请检查是否有其他东西搞乱了它。

另一种方法是:

$timestamp = strtotime(str_replace('/', '.', $dateInput));
$mysql_date = date('Y-m-d', $timestamp); 

1
使用斜杠时,strtotime() 函数需要一个美国格式的日期,而不是英国格式的日期,这就是为什么它会对某些值出现错误的原因。 - Tushar
1
我一直在想02/03/04是2004年3月2日、2002年3月4日、2004年2月3日还是其他日期。我认为PHP总是采用最后一种可能性,因此这不是输入中给出的日期。 - Voitcus
@Tushar 谢谢,当我看到日期时就明白了它出了问题。 - StudioTime

2

试一下这个:

$dte  = '28/03/2013';
$dt   = new DateTime();
$date = $dt->createFromFormat('d/m/Y', $dte);
echo $date->format('Y-m-d');

输出: 2013-03-28


最佳答案,谢谢! - ferreirabraga

1
$date_array = explode("/",$your_date); // split the array
$var_day = $date_array[0]; //day seqment
$var_month = $date_array[1]; //month segment
$var_year = $date_array[2]; //year segment
echo $new_date_format = "$var_year-$var_day-$var_month"; // join them  together

这将有效。

1

PHP 5.3及以上版本

使用DateTime::createFromFormat。它允许您指定一个确切的掩码 - 使用date()语法 - 来解析传入的字符串日期。

PHP 5.2及以下版本

您需要使用substr()手动解析元素(年、月、日、小时、分钟、秒),并将结果传递给mktime()来构建时间戳。


他已经在使用 strtotime() - ulentini

0

几种替代方法。两种都输出2013-03-31:

方法1 - “看吧,没有函数”

<?php
    $in = '31/03/2013';
    echo $in[6].$in[7].$in[8].$in[9].'-'.$in[3].$in[4].'-'.$in[0].$in[1];
    ?>    

方法二 - 正则表达式

<?php
    echo ($output = preg_replace('!^([0-9]{2})/([0-9]{2})/([0-9]{4})$!',"$3-$2-$1",$input));
?>

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