在PHP中转换日期格式


489

我正在尝试将日期从转换yyyy-mm-dddd-mm-yyyy(但是在SQL中不是); 但是我不知道date函数如何需要时间戳,并且无法从该字符串获取时间戳。

这怎么可能?


21
dd-mm-yyyy是(大多数)欧洲的标准格式,至少在您需要向用户展示数据时。
Matteo Riva

7
dd-mm-yyyy也在澳大利亚和新西兰
乔纳森·戴

2
mm-dd-yyyy在美国。@stesch:前者是SQL的标准。我不确定这在任何国家都是标准的。:)
赫伯特

10
实际上,根据ISO 8601标准是yyyy-mm-dd 。
Jezen Thomas

7
全局“标准”为yyyy-mm-dd,并且应尽可能在系统中始终使用。世界上大多数国家/地区(美国除外)使用的日期,月份,年月日顺序通常是斜杠,而不是连字符。为避免混淆,我只用连字符分隔YYYY-MM-DD。任何其他日期格式,我都会用斜杠分隔。这使事情保持一致。
rjmunro

Answers:


1055

使用strtotime()date()

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

(请参阅PHP网站上的strtotimedate文档。)

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


14
如果我从mySQL获取日期注册怎么办?它会返回错误的日期,例如1969
Enrique

3
@Enrique:如果从MySQL获得000-00-00,则应先进行FIRST测试,然后再进行转换。简单。
ShadowStorm 2012年

1
@SobinAugustine等:strtotime()会将日期字符串转换为“ Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数)”,date()可以理解该格式,然后将其转换。因此,此设置不适用于1970
。– Samuel Lindblom 2014年

1
@SamuelLindblom不,它不是那样的,它将在1970
Sobin Augustine

1
@SobinAugustine:你是对的。但是,它将在1901-12-14之前不起作用,因此仍然适用于为什么上面列出的日期不起作用。
塞缪尔(Samuel Lindblom)2014年

271

如果您想避免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的格式。

或者,如果源格式始终为“ Ymd”(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
?>

17
感谢您DateTime::createFromFormat()-它确实比strtotime()
Gtx

2
注意:前两种方法需要PHP 5.3+。
Salman von Abbas

感谢您使用新的DateTime选项。那行得通,是一个非常干净的选择。
Nina Morena

1
strtotime()用于将True Type格式(Ymd)转换为其他格式,但是DateTime::createFromFormat()很通用。这就像STR_TO_DATE在MySQL
塔龙Saribekyan

这个只是对我真正有用,而不是胡说八道-Code strtotime()
Cooker

72

采用:

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

没有日期转换的开销,我不确定这会很重要。


是的,我相信当您提交您的论文时回答。当然,在strtotime中发现的错误检查可能有用。
Tim Lytle 2010年

2
对我转换非美国日期格式很有用... dd-mm-yyyy => yyyy-mm-dd请参阅php.net/manual/en/datetime.formats.date.php
Chris Jacob

5
不明白为什么这个答案得票少。它应该是票数最高的答案。它可以简单,快速地解决问题,没有任何问题。谢谢
Naeem Ul Wahhab 2013年

2
如果您需要将日期格式恢复为原始格式,甚至可以再次调用它。的确是最佳答案。:)
Pedro Araujo Jorge

1
这应该更改为可接受的答案,它解决了使用日期和日期格式的所有日期时间问题。
Matteo Bononi'peorthyr'2014/


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

有关更多信息,请参见的文档strtotime

甚至更短:

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

27

还有另一个晦涩的可能性:

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

我不知道我是否会使用它,但仍然:)


1
我之所以使用它,是因为在我们的应用程序中,如果其中一个字段(天,月,年)未知,人们将输入“ 99”。如果您的数据中有任何“假”日期,这是个好方法。
Voodoo

18

注意:由于此帖子的答案有时会被高估,所以我回到这里是为了请人们不要再对其进行投票。我的答案很古老,在技术上并不正确,这里有几种更好的方法。我仅出于历史目的将其保留在此处。

尽管文档很少描述strtotime函数,但@rjmunro在其注释中正确地解决了该问题:它的ISO格式为日期“ YYYY-MM-DD”。

另外,即使我的Date_Converter函数仍然可以运行,我也要警告下面可能有不精确的语句,因此请不要理会它们。

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

PHP strtotime手册在此处指出:“该函数期望提供包含英语日期格式的字符串”。它的实际含义是期望使用美国的美国日期格式,例如“ mdY”或“ m / d / Y”。

这意味着提供的日期“ Ymd”可能会被误解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。这比分解/嵌入日期更容易。
伊戈尔·多宁

3
最重要的答案是正确的。PHP使用ISO格式日期“ YYYY-MM-DD”执行正确的操作。它不能误解为美国日期,因为它的开头有4位数字,并且使用-而不是/作为分隔符。ISO日期经过精心设计,以免与其他格式混淆。
rjmunro

14

有两种方法可以实现此目的:

1。

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

2。

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


8

使用此功能可以将任何格式转换为任何格式

function reformatDate($date, $from_format = 'd/m/Y', $to_format = 'Y-m-d') {
    $date_aux = date_create_from_format($from_format, $date);
    return date_format($date_aux,$to_format);
}

7

下面给出的PHP代码用于使用生成明天的日期mktime(),并将其格式更改为dd / mm / yyyy格式,然后使用进行打印echo

$tomorrow = mktime(0, 0, 0, date("m"), date("d") + 1, date("Y"));
echo date("d", $tomorrow) . "/" . date("m", $tomorrow). "/" . date("Y", $tomorrow);


2

您可以使用date()和strtotime()更改格式。

$ date ='9/18/2019';

回声日期('dm-y',strtotime($ date));

结果:

19-09-19

我们可以通过更改(dmy)来更改格式。


1

对于此特定的转换,我们还可以使用格式字符串。

$new = vsprintf('%3$s-%2$s-%1$s', explode('-', $old));

显然,这不适用于许多其他日期格式转换,但是由于在这种情况下我们只是重新排列子字符串,因此这是另一种可行的方法。


如何将2019-10-28T17:02:49Z转换为时间戳?
Bogdan Bogdanov

1
使用strtotime()。:-)
不要惊慌

0

简单方法使用strtotime()date()

$original_dateTime = "2019-05-11 17:02:07"; #This may be database datetime
$newDate = date("d-m-Y", strtotime($original_dateTime));

随着时间的推移

$newDate = date("d-m-Y h:i:s a", strtotime($original_dateTime));

0

使用date_createdate_format

尝试这个。

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}

0
    function dateFormat($date) {
        $m = preg_replace('/[^0-9]/', '', $date);
        if (preg_match_all('/\d{2}+/', $m, $r)) {
        $r = reset($r);
            if ($r[2] <= 12 && $r[3] <= 31) return "$r[0]$r[1]-$r[2]-$r[3]";// Y-m-d
            if ($r[0] <= 31 && $r[1] != 0 && $r[1] <= 12) return "$r[2]$r[3]-$r[1]-$r[0]";// d-m-Y
            if ($r[0] <= 12 && $r[1] <= 31) return "$r[2]$r[3]-$r[0]-$r[1]";// m-d-Y
            if ($r[2] <= 31 && $r[3] <= 12) return "$r[0]$r[1]-$r[3]-$r[2]";//Y-m-d
        }
    }

var_dump(dateFormat('31/01/2000')); // return 2000-01-31
var_dump(dateFormat('01-31-2000')); // return 2000-01-31
var_dump(dateFormat('2000-31-01')); // return 2000-01-31
var_dump(dateFormat('20003101')); // return 2000-01-31
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.