在PHP中转换日期格式

563

我想把一个日期从yyyy-mm-dd转换成dd-mm-yyyy(但不是在SQL中)。然而,我不知道如何做到这一点,因为日期函数需要一个时间戳,并且我无法从这个字符串中获取时间戳。

这怎么可能呢?


为什么你想要这样做呢?前者在大多数国家都是标准的。http://www.qsl.net/g1smd/isoimp.htm - stesch
24
dd-mm-yyyy是欧洲(大部分地区)在向用户展示数据时的标准格式。 - Matteo Riva
7
澳大利亚和新西兰也使用dd-mm-yyyy的日期格式。 - Jonathan Day
3
美国日期格式为月-日-年。@stesch:在SQL中前者是标准的。我不确定它是否是任何国家的“标准”。 :) - Herbert
13
根据ISO 8601,实际上标准日期格式为yyyy-mm-dd。 - Jezen Thomas
11
全球“标准”日期格式为yyyy-mm-dd,系统应尽可能使用该格式。日、月、年的排序方式在世界上大多数国家(美国除外)被人们使用,但通常使用斜杠而非连字符。为避免混淆,我只会用连字符将YYYY-MM-DD分隔开,其他日期格式则会用斜杠进行分隔,以保持一致性。 - rjmunro
18个回答

1194

使用strtotime()date()函数:

$originalDate = "2010-03-21";
$newDate = date("d-m-Y", strtotime($originalDate));

(请查看PHP官方网站上的strtotimedate文档。)

请注意,这只是对原始问题的快速解决方案。如果需要进行更广泛的转换,您应该使用DateTime类来解析和格式化 :-)


16
如果我从MySQL中获取到日期为0000-00-00,那么它会返回一个错误的日期,例如31/12/1969... - Enrique
4
如果你从MySQL中得到000-00-00,那么在进行转换之前,应该首先对其进行测试。很简单。 - ShadowStorm
2
@SobinAugustine等人:strtotime()函数将日期字符串转换为“Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数)”,这是date()函数可以理解并进行转换的格式。因此,它无法处理1970年之前的时间戳。 - Samuel Lindblom
1
@SamuelLindblom 不是这样的,它可以在1970年之前工作。 - Sobin Augustine
1
@SobinAugustine:你说得对。然而,在1901-12-14之前它是不起作用的,所以这仍然适用于为什么上面列出的日期不起作用。 - Samuel Lindblom
显示剩余4条评论

320

如果您想避免strtotime转换(例如,strtotime无法解析您的输入),则可以使用:

$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('d-m-Y');

或者,等价地:

$newDateString = date_format(date_create_from_format('Y-m-d', $dateString), 'd-m-Y');

你首先给出了$dateString的格式。然后告诉它你想要$newDateString的格式。

或者,如果源格式始终为"Y-m-d"(yyyy-mm-dd),那么只需使用DateTime

<?php
    $source = '2012-07-31';
    $date = new DateTime($source);
    echo $date->format('d.m.Y'); // 31.07.2012
    echo $date->format('d-m-Y'); // 31-07-2012
?>

23
谢谢你使用DateTime::createFromFormat() - 它比strtotime()更有用。 - Gtx
2
注意:前两种方法需要 PHP 5.3 或更高版本。 - salmatron
感谢您提供的新DateTime选项。它很有效,并且是一个非常干净的选项。 - Nina Morena
1
strtotime()函数用于将真实格式(Y-m-d)转换为其他格式,但是DateTime::createFromFormat()函数则是通用性更强的选择。 它类似于MySQL中的STR_TO_DATE函数。 - Taron Saribekyan
这个对我来说真的很有效,而不是胡扯的 strtotime() - Code Cooker
这应该是被接受的答案。没有人知道(或理解)strtotime如何工作。 - Salman A

76

使用:

implode('-', array_reverse(explode('-', $date)));

没有日期转换的开销,我不确定它是否会有太大影响。


是的,我相信我在你提交之前已经回答了。当然,在strtotime中发现的错误检查可能会很有用。 - Tim Lytle
2
对我而言非常有用,可以将非美式日期格式转换为:dd-mm-yyyy => yyyy-mm-dd参见 http://www.php.net/manual/en/datetime.formats.date.php - Chris Jacob
2
如果需要将日期格式恢复到原始形式,您甚至可以再次调用它。确实是最佳答案。 :) - Pedro Araujo Jorge
@MatteoBononi'peorthyr',这并不能解决所有日期时间问题。如果日期格式是d-M-Y,而你想要转换成Y-m-d,该怎么办呢? - krishna
使用explode $date[0]."/".date('m', strtotime($date[1]))."/".$date[2] 更方便。将月份转换为数字,如果不生效,请尝试strtotime,这可能是由于时区引起的。 - KingRider

39
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);

这段代码适用于任何日期格式。

您可以根据自己的旧日期格式更改替换变量的顺序,例如$3-$1-$2。


32
$timestamp = strtotime(your date variable); 
$new_date = date('d-m-Y', $timestamp);

更多信息请参见strtotime函数的文档

甚至可以更简短:

$new_date = date('d-m-Y', strtotime(your date variable));

30

还有另外一个不常见的可能性:

$oldDate = '2010-03-20'
$arr = explode('-', $oldDate);
$newDate = $arr[2].'-'.$arr[1].'-'.$arr[0];

我不知道是否会使用它,但还是保留一下 :)


1
我最终使用了这个方法,因为在我们的应用程序中,如果某个字段(日、月、年)未知,人们会输入“99”。如果您的数据中有任何“虚假”日期,这是一个好方法。 - Voodoo

19

有两种实现方法:

1.

    $date = strtotime(date);
    $new_date = date('d-m-Y', $date);

2.

->

2.

    $cls_date = new DateTime($date);
    echo $cls_date->format('d-m-Y');

16

注意:由于本帖答案有时会被点赞,我特意回来友善地请求大家不要再点赞了。我的回答已经过时、技术上不正确,而且还有几种更好的方法可供选择。我只是为了历史记录而保留它。

尽管strtotime函数的文档描述非常贫乏,但 @rjmunro 在他的评论中正确地解决了这个问题:日期应该使用 ISO 格式 "YYYY-MM-DD"。

此外,即使我的Date_Converter函数仍然有效,但我想警告一下,下面可能有不准确的陈述,请忽略它们。

得票最多的答案实际上是不正确的!

PHP strtotime手册在这里指出:“该函数期望获得一个包含英文日期格式的字符串”。实际上,它期望的是美国日期格式,例如“m-d-Y”或“m/d/Y”。

这意味着以“Y-m-d”的形式提供的日期可能会被strtotime错误解释。您应该以期望的格式提供日期。

我编写了一个小函数来返回几种格式的日期。随意使用和修改。如果有人将其转化为类,我会很高兴分享。

function Date_Converter($date, $locale = "br") {

    # Exception
    if (is_null($date))
        $date = date("m/d/Y H:i:s");

    # Let's go ahead and get a string date in case we've
    # been given a Unix Time Stamp
    if ($locale == "unix")
        $date = date("m/d/Y H:i:s", $date);

    # Separate Date from Time
    $date = explode(" ", $date);

    if ($locale == "br") {
        # Separate d/m/Y from Date
        $date[0] = explode("/", $date[0]);
        # Rearrange Date into m/d/Y
        $date[0] = $date[0][1] . "/" . $date[0][0] . "/" . $date[0][2];
    }

    # Return date in all formats
        # US
        $Return["datetime"]["us"] = implode(" ", $date);
        $Return["date"]["us"]     = $date[0];

        # Universal
        $Return["time"]           = $date[1];
        $Return["unix_datetime"]  = strtotime($Return["datetime"]["us"]);
        $Return["unix_date"]      = strtotime($Return["date"]["us"]);
        $Return["getdate"]        = getdate($Return["unix_datetime"]);

        # BR
        $Return["datetime"]["br"] = date("d/m/Y H:i:s", $Return["unix_datetime"]);
        $Return["date"]["br"]     = date("d/m/Y", $Return["unix_date"]);

    # Return
    return $Return;

} # End Function

2
继续阅读,我喜欢Ceiroa对此的修复。这比分解/合并日期要容易得多。 - Igor Donin
3
顶部答案并没有错误。对于 ISO 格式的日期“YYYY-MM-DD”,PHP会执行正确操作。它无法将其误解为美国日期,因为它在开头有4个数字,并且使用 - 而不是 / 作为分隔符。ISO日期被精心设计为不易与其他格式混淆。 - rjmunro

9

您可以尝试使用strftime()函数。简单的示例:strftime($time, '%d %m %Y');


注意:这在 PHP 8.1 中已被弃用。 - vesmihaylov

9

在PHP中,可以使用不同的方案将任何日期转换为所需的日期格式,例如将任何日期格式更改为“Day, Date Month Year”。

$newdate = date("D, d M Y", strtotime($date));

它将以以下非常好的格式显示日期:
周一,2020年11月16日

1
如果你有时间,可以使用现有的日期格式进行转换。例如,如果你有SQL的datetime格式为2020-11-11 22:00:00,你可以使用以下方法将其转换为所需的日期格式。 - Hassan Qasim
1
$newdateformat = date("D, d M Y H:i:s", strtotime($oldateformat)); 新日期格式 = date("D, d M Y H:i:s", strtotime($oldateformat)); - Hassan Qasim

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