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

我真的很喜欢strtotime()函数,但是用户手册没有给出支持date格式的完整描述。 strtotime('dd/mm/YYYY')不起作用,只能用mm/dd/YYYY格式。

如果以日dd/mm/YYYY格式显示date,我怎样才能将它转换为YYYY-mm-dd ? 我可以通过使用explode()函数来做到这一点,但我认为有更好的解决scheme。

这里是简化的解决scheme:

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

结果:

 2010-05-25 

时间文件写道:

m / d / ydmy格式的date通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜线( / ),则假定美国m / d / y ; 而如果分隔符是破折号( )或点( ),则假定欧洲的dmy格式。

您可以使用DateTime :: createFromFormat从自定义格式(从PHP 5.3开始)parsingdate

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

(另外: !用于将非指定值重置为Unix时间戳,即时间将是午夜。)


如果您不想(或不能)使用PHP 5.3,则在date格式手册页上列出了strtotime接受的可用date/时间格式的完整列表。 该页面更加深入地描述了m/d/Y超过d/m/Y的事实(但是您可以像在这里的答案中提到的那样使用dmYdmYd\tm\tY )。


在过去,我也采取了另一个答案中提到的快速str_replace ,以及自parsingdatestring到另一种格式

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

从STRTOTIME书面注意:

m / d / y或dmy格式的date通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜线(/),则假定美国m / d / y; 而如果分隔符是破折号( – )或点(。),则假定欧洲的dmy格式。

它是如此简单。

这是许多问题的一个很好的解决scheme:

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

最快可能应该是

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

如果格式看起来不正确,这将返回false,但是不会检查date是否有效

我还没有find更好的解决scheme。 你可以使用explode()preg_match_all()

我有一个像这样的静态帮助函数

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

可能有一个更好的名字,但我使用ausStrToTime()因为它适用于澳大利亚date(我经常处理,澳大利亚)。 一个更好的名字可能是标准化的名字,但我不知道那是什么。

你从数据库中获得这个值吗? 如果是这样,请考虑在数据库中格式化(例如,在mysql中使用date_format )。 如果没有,爆炸的价值可能是最好的select,因为strtotime似乎不喜欢dd / mm / yyyy值。

如果你知道这是在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(或两者的任意组合)forms匹配date。

如果你想支持更多的分隔符而不是/,你可以改变正则expression式为:

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

然后添加你想要的任何字符到[/-]位(注意, – 字符需要是最后一个)

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

 $my_date = str_replace("/", ".", $my_date); $my_date = strtotime($my_date); $my_date = date("Ymd", $my_date); 

您不必知道您获取date的格式,但是如果它带有斜杠,则会被完全停止replace,并且会被视为欧洲时间。

我试图将ddmmyy格式转换为date("Ymd"格式,但直接通过ddmmyy =date('dmy')时不工作

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

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

然后传递给date("Ymd",strtotime($strParam));

有效!

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

这将为你工作。 将string转换为自定义date格式,您可以在其中指定PHP给出的原始格式的string。 现在,这是一个date格式,您可以将其转换为PHP的默认date格式,这与MySQL使用的格式相同。

最简单的解决方法是:

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