【问题标题】:Convert a date format in PHP [duplicate]在PHP中转换日期格式[重复]
【发布时间】: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。我将用斜杠分隔任何其他日期格式。这使事情保持一致。

标签: php date formatting


【解决方案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('/\d{2}+/', $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 站点上的 strtotimedate 文档。)

              请注意,这是对原始问题的快速解决方案。对于更广泛的转换,您真的应该使用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。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2021-04-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多