在PHP中转换日期格式[重复]

Posted

技术标签:

【中文标题】在PHP中转换日期格式[重复]【英文标题】:Convert a date format in PHP [duplicate] 【发布时间】:2011-01-30 02:00:05 【问题描述】:

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

这怎么可能?

【问题讨论】:

dd-mm-yyyy 是欧洲(大部分地区)的标准格式,至少在您需要向用户展示数据时是这样。 dd-mm-yyyy 在澳大利亚和新西兰也是如此 mm-dd-yyyy 在美国。 @stesch:前者是 SQL 中的标准。我不确定它在任何国家/地区是否是标准。 :) 其实标准是根据ISO 8601的yyyy-mm-dd。 全局“标准”是 yyyy-mm-dd,系统应尽可能使用。世界上大部分地区(美国除外)的人都使用日、月、年的顺序,但通常使用斜线,而不是连字符。为避免混淆,我只用连字符分隔 YYYY-MM-DD。我将用斜杠分隔任何其他日期格式。这使事情保持一致。 【参考方案1】:

php 中,可以使用不同的场景将任何日期转换为所需的日期格式,例如将任何日期格式更改为 日、日、月、年

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

它将以以下非常好的格式显示日期

2020 年 11 月 16 日,星期一

【讨论】:

如果您在现有日期格式中也有时间,例如,如果您的日期时间格式为 SQL 2020-11-11 22:00:00,您可以使用关注 $newdateformat = date("D, d M Y H:i:s", strtotime($oldateformat));【参考方案2】:
function dateFormat($date)

    $m = preg_replace('/[^0-9]/', '', $date);
    if (preg_match_all('/\d2+/', $m, $r)) 
        $r = reset($r);
        if (count($r) == 4) 
            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
        

        $y = $r[2] >= 0 && $r[2] <= date('y') ? date('y') . $r[2] : (date('y') - 1) . $r[2];
        if ($r[0] <= 31 && $r[1] != 0 && $r[1] <= 12) return "$y-$r[1]-$r[0]"; // d-m-y
    


var_dump(dateFormat('31/01/00')); // return 2000-01-31
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

【讨论】:

试试 2001-31-12 (Y-d-m)。我确定您的代码会输出 3112-01-20(类似于 md-y-y),这显然是错误的。第二种情况。【参考方案3】:

使用date_createdate_format

试试这个。

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

【讨论】:

【参考方案4】:

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

$date = '9/18/2019';

回显日期('d-m-y',strtotime($date));

结果:

18-09-19

我们可以通过改变 (d-m-y) 来改变格式。

【讨论】:

【参考方案5】:

简单方式使用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));

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

如何将 2019-10-28T17:02:49Z 转换为时间戳? 使用strtotime()。 :-)【参考方案7】:

您可以尝试strftime() 功能。简单例子:strftime($time, '%d %m %Y');

【讨论】:

【参考方案8】:

有两种实现方式:

1.

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

2.

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

【讨论】:

【参考方案9】:

注意:因为这篇文章的答案有时会被点赞,所以我回来了 在这里恳请人们不要再投票了。我的回答是 古老,技术上不正确,还有几个更好的 接近这里。我只是把它留在这里作为历史 目的。

虽然文档对 strtotime 函数的描述很差, @rjmunro 在他的评论中正确地解决了这个问题:它在 ISO 中 格式化日期“YYYY-MM-DD”。

另外,即使我的 Date_Converter 函数可能仍然有效,我会 想警告一下,下面可能有不准确的陈述,所以请 不要理会他们。

投票最多的答案实际上是错误的!

PHP strtotime 手册here 声明“该函数需要一个包含英文日期格式的字符串”。 它的实际意思是它需要一个美国美国日期格式,例如“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

【讨论】:

继续阅读,我喜欢 Ceiroa 修复它。这比爆炸/内爆日期容易得多。 上面的答案没有错。 PHP 使用 ISO 格式日期“YYYY-MM-DD”做正确的事。它不能将其误解为美国日期,因为它的开头有 4 位数字,并且它使用 - 而不是 / 作为分隔符。 ISO 日期经过精心设计,不会与其他格式混淆。【参考方案10】:

如果您想避免 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
?>

【讨论】:

感谢DateTime::createFromFormat()——它真的比strtotime()更有用 注意:前两种方法需要 PHP 5.3+。 感谢您提供新的 DateTime 选项。这很有效,而且是一个非常干净的选择。 strtotime() 用于将 true type 格式 (Y-m-d) 转换为其他格式,但 DateTime::createFromFormat() 是通用的。就像 mysql 中的STR_TO_DATE 这个真的对我有用 而不是废话strtotime()【参考方案11】:

用途:

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

如果没有日期转换开销,我不确定它会不会很重要。

【讨论】:

是的,我相信你提交的时候已经回答了。当然,在 strtotime 中发现的错误检查可能很有用。 对我转换非美国日期格式很有用... dd-mm-yyyy => yyyy-mm-dd 见php.net/manual/en/datetime.formats.date.php 不明白为什么这个答案的票数较少。它应该是最高投票的答案。它简单快速地解决了问题,没有任何问题。谢谢 如果您需要将日期格式反转为原始格式,您甚至可以再次调用它。确实是最佳答案。 :) 这应该被更改为接受的答案,它解决了使用日期和日期格式的所有日期时间问题。【参考方案12】:
$timestamp = strtotime(your date variable); 
$new_date = date('d-m-Y', $timestamp);

更多信息,请参阅documentation for strtotime

甚至更短:

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

【讨论】:

【参考方案13】:

使用strtotime()date()

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

(请参阅 PHP 站点上的 strtotime 和 date 文档。)

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

【讨论】:

如果我从 mySQL 得到这个日期 0000-00-00 怎么办?它返回一个错误的日期,例如 31/12/1969 ... @Enrique:如果您从 MySQL 获得 000-00-00,您应该在转换之前针对 FIRST 进行测试。简单。 @SobinAugustine et al: strtotime() 会将日​​期字符串转换为“Unix 时间戳(自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数)”,格式 date() 可以理解然后转换。所以这不适用于 1970 年之前的时间戳。 @SamuelLindblom 不,不是那样的,它会在 1970 年之前工作。 @SobinAugustine:你是对的。但是,它在 1901-12-14 之前不起作用,因此这仍然适用于上面列出的日期不起作用的原因。【参考方案14】:

还有另一种不明显的可能性:

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

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

【讨论】:

我最终使用了它,因为在我们的应用程序中,如果其中一个字段(日、月、年)未知,人们会输入“99”。如果您的数据中有任何“假”日期,这是一种很好的方法。【参考方案15】:

使用此功能可以从任意格式转换为任意格式

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);

【讨论】:

【参考方案16】:
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));

【讨论】:

对于 Mysql,日期格式为 Y-m-d,如“2014-04-26”【参考方案17】:

下面给出的 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);

【讨论】:

【参考方案18】:
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);

此代码适用于每种日期格式。

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

【讨论】:

以上是关于在PHP中转换日期格式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

php将日期格式转换为mysql格式以进行插入[重复]

如何使用php将日期格式转换为日期时间格式[重复]

以不同格式PHP转换日期格式[重复]

PHP将格式化日期转换为unixtime [重复]

将格式 MM/DD/YYYY 的日期转换为 MySQL 日期 [重复]

在php中将纪元时间斜坡转换为格式化的日期字符串[重复]