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 / y或dmy格式的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
的事实(但是您可以像在这里的答案中提到的那样使用dmY
, dmY
或d\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));