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

125

我想将一个日期从dd/mm/yyyy => yyyy-mm-dd格式进行转换。我已经使用了mktime()函数和其他函数,但似乎不能使其正常工作。 我已经成功使用'/'作为分隔符来拆分原始日期,但无法成功更改格式并将'/'替换为'-'

非常感谢任何帮助。


尝试这个:$old_date = "20/04/2012"; $new_date = date("Y-m-d", strtotime($old_date) ); - Adeel Ahmed Baloch
5个回答

334

日期格式为m/d/yd-m-y时,通过查看各个组件之间的分隔符来消除歧义: 如果分隔符是斜杠(/),则假定使用美国的m/d/y格式; 而如果分隔符是短划线(-)或句点(.),则假定使用欧洲的d-m-y格式。查阅更多信息

使用默认的日期函数。

$var = "20/04/2012";
echo date("Y-m-d", strtotime($var) );

编辑 我刚刚测试了一下,不知怎么回事,PHP不能很好地处理dd/mm/yyyy格式。这里有另一个解决方案。

$var = '20/04/2012';
$date = str_replace('/', '-', $var);
echo date('Y-m-d', strtotime($date));

2
如果我使用dd/mm/yyyy格式,这里只会得到1970-01-01。但是,如果使用mm/dd/yyyy格式,这段代码就可以正常工作。 - Sibiraj PR
34
@m/d/y或d-m-y格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠(/),则默认为美国的m/d/y格式;而如果分隔符是破折号(-)或点(.),则默认为欧洲的d-m-y格式。查看更多信息:http://www.php.net/manual/en/function.strtotime.php - hjpotter92
3
这看起来还可以,但实际上不行。在2045年05月04日,会假定为美国日期格式并给出5月4日而不是4月4日。这是一个间歇性的和危险的错误 - 根据hjpotter所说。这个答案应该标记为错误。 - Tim Ogilvy
4
$var = '20/04/2012'; $date = str_replace('/', '-', $var); echo date('Y-m-d', strtotime($date)); // 这个方法适用于我输入格式为dd/mm/yy的日期。 - Linga
6
strtotime()函数在解析日期字符串时,根据输入的格式来确定月份和日期的位置。如果输入的日期格式是mm-dd-yyyy,则strtotime()会将第一个数字解释为月份,第二个数字解释为日期。相反,如果输入的日期格式是dd-mm-yyyy,则strtotime()会将第一个数字解释为日期,第二个数字解释为月份。因此,当输入的日期字符串格式不同时,strtotime()解析的结果也会不同。 - Bakly
显示剩余8条评论

126

尝试使用DateTime::createFromFormat

$date = DateTime::createFromFormat('d/m/Y', "24/04/2012");
echo $date->format('Y-m-d');

输出

2012-04-24

编辑:

如果日期是5/4/2010(无论是D/M/YYYY还是DD/MM/YYYY格式),则使用以下方法将其转换为2010-4-5(无论是YYYY-MM-DD还是YYYY-M-D格式)。

$old_date = explode('/', '5/4/2010'); 
$new_data = $old_date[2].'-'.$old_date[1].'-'.$old_date[0];

输出:

2010-4-5

如果您有mm/dd/yyyy格式且想要转换为yyyy-mm-dd格式,请尝试以下方法。这对我很有效。$var1 = "03/01/2014"; $date = DateTime::createFromFormat('m/d/Y', $var1); $travel_date = $date->format('Y-m-d');输出结果为“2014-03-01”。 - Jayani Sumudini
这是解决所有日期问题最灵活的方案。我怎么能在这些年里错过它。谢谢! - Arne
1
这应该是正确的答案。 - Plugie
仍然不正确,当您输入日期 $date = DateTime::createFromFormat('d/m/Y', "06/16/2022"); echo $date->format('Y-m-d'); 结果将是:2023-04-06。 - Vilthering

40

下面是另一种不使用date()函数的解决方案。这个方法并不是很聪明 :)

$var = '20/04/2012';
echo implode("-", array_reverse(explode("/", $var)));

7
如果它不聪明,为什么它如此机智。我完全看不出这个解决方案有任何问题,并且它可以避免在日期和地点上瞎搞。每次都保证表现良好。 - Tim Ogilvy
@tosin 非常有创意的解决方案! - Han Arantes
1
只有当他们像05/04/2010这样添加0时,才能起作用,如果他们写成5/4/2010,它就不起作用。 - Shadoweb
1
@Shadowbob,OP要求进行dd/mm/yyyy转换,因此5/4/2010永远不可能是输入。在日期或月份为一位数字的情况下,dd和mm命名始终有0前缀。这是一个聪明的解决方案。 - Dr. DS
1
@Vagabond 我认为这是完全可行的,至少对我来说似乎没有性能或功能上的缺陷。 - Syed M. Sannan
显示剩余2条评论

6
做这个:
date('Y-m-d', strtotime('dd/mm/yyyy'));

但请确保 'dd/mm/yyyy' 是实际日期。

1
这是有问题的,因为strtotime将使用/分隔符读取日期作为美国格式,即m/d/Y,而使用-作为欧洲格式d-m-Y。请参见已接受答案的编辑和php文档:http://php.net/manual/en/function.strtotime.php - 注意:在m/d/y或d-m-y格式中的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠(/),则假定为美国格式m/d/y;而如果分隔符是破折号(-)或点号(.),则假定为欧洲格式d-m-y。 - haakym

1

我能看到很棒的答案,所以这里不需要重复了,我想提供一些建议:

我建议使用 Unix 时间戳整数来处理时间内部,而不是使用人类可读的日期格式,然后使用 PHP 的 date() 函数将时间戳值转换为用户显示的人类可读日期格式。以下是如何实现的简单示例:

// Get unix timestamp in seconds
$current_time = date();

// Or if you need millisecond precision

// Get unix timestamp in milliseconds
$current_time = microtime(true);

然后在您的应用程序中根据需要使用$current_time(存储、添加或减去等),当您需要向用户显示日期值时,可以使用date()来指定所需的日期格式:
// Display a human-readable date format
echo date('d-m-Y', $current_time);

通过使用这种方式,您将避免处理日期格式、转换和时区所带来的许多麻烦,因为您的日期将采用标准化格式(Unix时间戳),该格式紧凑、时区无关(始终在UTC中)并且在编程语言和数据库中得到广泛支持。

2
@VitorTyburski 你不会认真吧?任何正常的专业程序员都知道将日期存储为时间戳是处理日期格式和添加或删除时间位的最佳方法,因为只需向时间戳值添加或减去一定数量的秒即可。 - Achraf Almouloudi
我经过一些学习,明白了你的观点。你是对的。虽然你没有回答问题。 - Vitor Tyburski
@VitorTyburski 你为什么删除了你的第一条评论呢?这只会让人觉得你太依赖“删除”功能来掩盖自己的错误。我还没有回答这个问题,因为当我看到这个帖子时,已经有一个最佳答案了,所以我只是想强调使用时间戳值是一个好习惯。 - Achraf Almouloudi
我错误地删除了第一个评论,但如果您希望我再次陈述:“不要使用时间戳,因为它们可能会导致夏令时等问题...”。再次声明我的评论是错误的,我很抱歉。我只是不删除反对票,因为我不能这样做,并且更重要的是,因为您应该发表评论。如果您编辑您的答案,我将很乐意撤销反对票。对此我感到非常抱歉。 - Vitor Tyburski
我也编辑了我的回复,以反映这只是一条注释,而不是对所问问题的确切回答。 - Achraf Almouloudi
有人在我发布改进编辑的几分钟前给这个答案点了踩。 - Achraf Almouloudi

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