使用strtotime在1970年之前的日期

时间:2010-05-20 05:37:41

标签: php mysql

我在mysql中有一个文本列,它以yyyy-mm-dd格式存储日期值。 现在,在我的php页面中,我使用此代码解析为日期值。

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

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

7 个答案:

答案 0 :(得分:14)

来自documentation for strtotime()

  

strtotime()在格林威治标准时间1901年12月13日20:45:54和格林威治标准时间2038年1月19日星期二03:14:07之间的范围限制;虽然在PHP 5.1.0之前,但在某些操作系统(Windows)上,此范围仅限于01-01-1970至19-01-2038。

您运行的是哪个版本的PHP?在什么平台上?也许现在是升级的时候了。

如果您正在处理1901年12月13日至2038年1月19日范围之外的日期,那么请考虑使用PHP的DateTime对象,这些对象可以使用更广泛的日期范围。

<强>程序:

$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");

答案 1 :(得分:1)

您应该使用date列,而不是文本1 和date_format() SQL函数,用于格式化查询中的日期

答案 2 :(得分:1)

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("Y-m-d", 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("Y-m-d", 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("Y-m-d", strtotime($string));//do normal strtotime
}

答案 3 :(得分:1)

$date = DateTime::createFromFormat('d M Y','17 Jan 1900');
echo $date->format('Y-m-d');

答案 4 :(得分:0)

我是一个菜鸟,并且在使用strtotime和爆炸时遇到了类似的问题。我碰到了这个帖子,得到了Mark Ba​​ker对日期限制更改的评论的帮助很大(谢谢!)。所以我写这个代码只是为了玩这个概念。也许它会帮助像我这样的其他新手。

只需更改顶部PHP行的日期,看看下面的日期会发生什么 - 非常有趣。 再次感谢!

<?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("m-d-Y", 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>

答案 5 :(得分:0)

为了更新现代,64位系统上的PHP7 strtotime()几乎可以处理任何AD日期,尽管由于某些原因,该手册页仍然说1970年。

$t = strtotime("4/1/1492");
echo "Stamp: $t\n";
echo date("m/d/Y",$t);

结果:

Stamp: -15076350000
04/01/1492

$t = strtotime("8/1/4921");
echo "Stamp: $t\n";
echo date("m/d/Y",$t);

结果

Stamp: 93142933200
08/01/4921

答案 6 :(得分:0)

我有一个Sql数据库,用于处理美国各州的成立时间,可回溯到1787年。此字段在数据库中以YYYY-MM-DD格式(例如1787-12-07)设置DATE。 。我尝试了许多方法,但发现的最简单有效的方法是: (我使用的确切代码片段。根据需要更改信息和变量。)

    <?php    
    $page = 'geo-usa.php';
    $sort = 'stateName';
     if (isset($_GET['sortBy'])){
      $sortBy = $_GET['sortBy'];
       if($sortBy == 'stateEst'){
        $sort = 'stateEst'; }
       if($sortBy == 'capital'){
        $sort = 'stateCapital'; }      
       if($sortBy == 'capitalEst'){
        $sort = 'stateCapitalEst'; }     }    
    $con=mysqli_connect($servername, $hostname, $password, $database);
     if (mysqli_connect_errno()){ print "Failed to connect to MySQL: " . 
       mysqli_connect_error(); exit(); }
    $stateData = "SELECT * FROM state ORDER BY $sort ASC, stateEst ASC";
    $stateData2 = mysqli_query($con, $stateData);
     while($stateData3 = mysqli_fetch_array($stateData2, MYSQLI_ASSOC)){
      $stateID = $stateData3['stateID'];
      $stateName = $stateData3['stateName'];
      $stateAbr = $stateData3['stateAbr'];
      $stateEstYear = $stateData3['stateEstYear'];
      $stateEst = $stateData3['stateEst'];
      $stateCapital = $stateData3['stateCapital'];
      $stateCapitalEst = $stateData3['stateCapitalEst'];
      $stateMotto = $stateData3['stateMotto'];

    //Here is how you format a yyyy-mm--dd date within a database
      $stateEstDate = date_create($stateData3['stateEst']);
      $stateEstFormat = date_format($stateEstDate, "l F d, Y");
    /// <- remove comments -

      print "<table border='0' bordercolor='lime' cellpadding='1' 
            cellspacing='1' width='100%'>
         <tr>
           <td align='left' style='padding-top:10px;'>
             <a href='$page' style='font-size:14px; color:red; text- 
               decoration:none; padding-left:7px'>
             $stateName</a></td>
          </tr>
         <tr>
           <td align='left' style='padding-left:20px;'>
             <a href='$page?sortBy=stateEst' style='font-size:10px; 
               color:white; text-decoration:none;'>
             $stateEstFormat </a></td>
          </tr>
        </table>"; } ?>

前2行的输出为:

特拉华州 1787年12月7日,星期五

宾夕法尼亚州 1787年12月12日,星期三