Strtotime()不适用于dd / mm / YYYY格式


167

我真的很喜欢该strtotime()功能,但是用户手册没有完整介绍受支持的日期格式。strtotime('dd/mm/YYYY')不起作用,仅适用于mm/dd/YYYY格式。

如果我有dd/mm/YYYY格式的日期,如何将其转换为YYYY-mm-dd?我可以通过使用explode()函数来实现,但是我认为有更好的解决方案。


7
您实际上不需要将其转换为“ YYYY-mm-dd”格式来进行解析-您只需要将其更改为“ dd-mm-YYYY”即可,这可以通过str_replace('/', '-', $date);
Gavin Coates

Answers:


399

这是简化的解决方案:

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

结果:

2010-05-25

strtotime文档的内容如下:

在日期米/ d / YDMY格式通过查看在各个组件之间的分离器消除歧义:如果隔板是斜线(/),那么美国米/ d / Y假设; 反之,如果分隔符是破折号(-)或点(),则采用欧洲dmy格式。


2
@Web Logic我无法理解strtotime()函数的默认格式,如果我编写strtotimr('01 -01-2010'),它将理解为dd-mm-YYYY或mm-dd-YYYY格式吗?
西蒙

3
如果使用以下方法进行测试:echo date('Y-m-l', strtotime('01-01-2010'));结果为2010-01-Friday。因此,最后一天取决于您如何为date函数指定日期格式。

1
尽管您在此处发布的内容是正确的,并且可以回答用户的问题-这是解决实际问题的一种round回方式。为了使strtotime()以“ dd / mm / yy”格式正确地解析日期,您需要将“ /”替换为“-”。因此,您实际上只需要答案的前两行:$date = '25/05/2010'; $date = str_replace('/', '-', $date); 不需要额外的行来解决您的问题。
加文·科茨

仅当日期> 12时才正确:$ date ='1/2/34'; // 2034年2月1日echo date('d M Y',strtotime($ date)); // 2034
1

谢了哥们。真的让我开心。
BEingprabhU

64

您可以使用DateTime :: createFromFormat从自定义格式(自PHP 5.3起)解析日期。

$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();

(此外:!用于将未指定的值重置为Unix时间戳,即时间为午夜。)


如果您不想(或不能)使用PHP 5.3,则日期格式手册页上列出了strtotime接受的可用日期/时间格式的完整列表。该网页更彻底地描述了这样的事实m/d/Y推断过d/m/Y(但你可以像在答案中提到这里,使用d-m-Yd.m.Yd\tm\tY)。


过去,我还求助于str_replace另一个答案中提到的quicky ,以及将日期字符串自动解析为另一种格式,例如

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);

17

这是解决许多问题的好方法:

function datetotime ($date, $format = 'YYYY-MM-DD') {

    if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
    if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
    if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);

    if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
    if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
    if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);

    if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
    if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
    if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);

    return mktime(0, 0, 0, $month, $day, $year);

}

16

从STRTOTIME撰写中注意:

通过查看各个组成部分之间的分隔符,可以消除m / d / y或dmy格式的日期的歧义:如果分隔符为斜杠(/),则假定为美国m / d / y;相反,如果分隔符是破折号(-)或点(。),则采用欧洲dmy格式。

它是如此简单。


我们可以实现这一点,因为它们不会给出错误,但是当我检查$t$t1显示不同的结果时。我这样检查。 $t=strtotime(date('d-m-Y'));$t1=strtotime(date('m/d/Y'));
vusan 2012年

3

最快应该是

false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date))

如果格式看起来不正确,则将返回false,但是它不会检查日期是否有效


2

我没有找到更好的解决方案。您可以使用explode()preg_match_all()等等。

我有一个像这样的静态助手功能

class Date {

    public static function ausStrToTime($str) {
        $dateTokens = explode('/', $str);
        return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); 

    }

}

可能有一个更好的名称,但我使用ausStrToTime()它是因为它适用于澳大利亚日期(作为澳大利亚人,我经常处理)。更好的名称可能是标准化名称,但我不确定这是什么。


2

我试图将ddmmyy格式转换为date("Y-m-d"format,但是当我直接通过时却无法正常工作ddmmyy =date('dmy')

然后意识到它必须采用yyyy-mm-dd格式。用子串来组织

$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);  

然后传给 date("Y-m-d",strtotime($strParam));

有效!


2

$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');

这将为您工作。您将String转换为自定义日期格式,可以在其中指定PHP所使用的String的原始格式。现在它是一种日期格式,您可以将其转换为PHP的默认日期格式,该格式与MySQL所使用的相同。


最干净,最优质的解决方案
Marco Marsala

1

您是从数据库中获得此​​值吗?如果是这样,请考虑在数据库中格式化它(date_format例如,在mysql中使用)。如果不是,则爆炸值可能是最好的选择,因为strtotime似乎并不喜欢dd / mm / yyyy值。


1

如果您知道它是dd / mm / YYYY,则可以执行以下操作:

    $regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#';
    $match = array();
    if (preg_match($regex, $date, $match)) {
        if (strlen($match[3]) == 2) {
            $match[3] = '20' . $match[3];
        }
        return mktime(0, 0, 0, $match[2], $match[1], $match[3]);
    }
    return strtotime($date);

它将以d / m / YY或dd / mm / YYYY格式(或两者的任意组合)匹配日期...

如果要支持的分隔符不只是/,可以将正则表达式更改为:

    $regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#';

然后将所需的任何字符添加[/-]到位(注意,-字符必须在最后)


当然你的正则表达式应该是使用\d十进制数字,而不是[/d]正斜或d字符
萨拉特(Salathe)2010年

1

此解决方法比爆炸更简单,更优雅:

$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);

您不必知道日期的格式,但是如果带有斜杠,则将其替换为句号,并在strtotime中将其视为欧洲格式。


0

最简单的解决方案是这样的:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));

3
错了 该问题与dd / mm / yyyy输入明确相关。
马特·弗莱彻

0

即使前导零在那,我也正在使用的解决方案。

<?php
 $date = '05/05/2017';
 $date = str_replace('/', '-', $date);
 $date = date('Y-m-d', strtotime($date));

 echo $date;
?>

0

$ date_info = '20 / 02/2019'; 回声日期('Ym-d',strtotime(str_replace('/','-',$ date_info)));


0

就这么简单

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
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.