在1970年之前使用strtotimedate

我在MySQL中有一个文本列,它存储格式为yyyy-mm-dd的date值。 现在,在我的PHP页面中,我使用此代码parsing为date值。

date("F j, Y", strtotime($row['value'])); 

现在,我刚刚读到strtotime()只在1970年1月1日之后parsing值。在那之前,我有很多date值。 有工作吗? 我不想改变我的数据库结构。

strtotime()的文档 :

strtotime()有一个范围之间的限制,周五之间1901年12月13日20时45分54秒和星期二2038年1月19日03时14分07秒; 尽pipe在PHP 5.1.0之前,在一些操作系统(Windows)上,这个范围从01-01-1970到19-01-2038是有限的。

你运行的是什么版本的PHP? 而在什么平台上? 也许是升级的时候了。

如果您使用的是1901年12月13日至2038年1月19日之外的date,那么可以考虑使用PHP的date时间对象,这些对象可以使用更广泛的date范围。

程序:

 $date = date_create($row['value']); if (!$date) { $e = date_get_last_errors(); foreach ($e['errors'] as $error) { echo "$error\n"; } exit(1); } echo date_format($date, "F j, Y"); 

OOP:

 try { $date = new DateTime($row['value']); } catch (Exception $e) { echo $e->getMessage(); exit(1); } echo $date->format("F j, Y"); 

你应该使用date列,而不是文本之一。
date_format() SQL函数在查询中格式化date

 function safe_strtotime($string) { if(!preg_match("/\d{4}/", $string, $match)) return null; //year must be in YYYY form $year = intval($match[0]);//converting the year to integer if($year >= 1970) return date("Ymd", strtotime($string));//the year is after 1970 - no problems even for Windows if(stristr(PHP_OS, "WIN") && !stristr(PHP_OS, "DARWIN")) //OS seems to be Windows, not Unix nor Mac { $diff = 1975 - $year;//calculating the difference between 1975 and the year $new_year = $year + $diff;//year + diff = new_year will be for sure > 1970 $new_date = date("Ymd", strtotime(str_replace($year, $new_year, $string)));//replacing the year with the new_year, try strtotime, rendering the date return str_replace($new_year, $year, $new_date);//returning the date with the correct year } return date("Ymd", strtotime($string));//do normal strtotime } 
 $date = DateTime::createFromFormat('d M Y','17 Jan 1900'); echo $date->format('Ym-d'); 

我是一个noob,并有一些类似的问题关于使用时间与爆炸。 我遇到了这个线程,并受到了Mark Ba​​ker对date限制变化的评论的大力帮助(谢谢!)。 所以我写这个代码只是为了玩这个概念。 也许它会帮助像我这样的其他noob。

只要改变最上面的PHP行的date,看看下面的date会发生什么 – 非常有趣。 再次感谢!

 <?php $dob = "1890-11-11"; ?> <html> <head> <style> .inputdiv { width:200px; margin:100px auto 10px auto; background-color:#CCC2FC; text-align:center; border:1px solid transparent;} .spacer{ width:199px; margin:20px auto 20px auto;} </style> </head> <body> <div class="inputdiv"> <div class="spacer"><?php echo "Raw dob: ".$dob ?></div> <div class="spacer"><?php echo "Strtotime dob: ".date("mdY", strtotime($dob)) ?></div> <div class="spacer"><?php list ($y, $m, $d) = explode('-', $dob); $dob = sprintf("%02d-%02d-%04d", $m, $d, $y); echo "Explode dob: ".$dob ?></div> </div> </body> </html>