在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_create
和date_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中转换日期格式[重复]的主要内容,如果未能解决你的问题,请参考以下文章