Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对1970年之前的日期使用strotime_Php_Mysql - Fatal编程技术网

Php 对1970年之前的日期使用strotime

Php 对1970年之前的日期使用strotime,php,mysql,Php,Mysql,我在mysql中有一个文本列,它以yyyy-mm-dd格式存储日期值。 现在,在我的php页面中,我使用此代码解析为日期值 date("F j, Y", strtotime($row['value'])); 现在,我刚刚读到strotime只在1970年1月1日之后解析值。在那个日期之前我有很多日期值。附近有工作吗?我不想改变我的数据库结构 您应该使用日期列,而不是文本列。 和date_format SQL函数,用于格式化查询中的日期: 标准时间的范围限制在1901年12月13日星期五20:4

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

date("F j, Y", strtotime($row['value']));
现在,我刚刚读到strotime只在1970年1月1日之后解析值。在那个日期之前我有很多日期值。附近有工作吗?我不想改变我的数据库结构

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

标准时间的范围限制在1901年12月13日星期五20:45:54 GMT和2038年1月19日星期二03:14:07 GMT之间;尽管在PHP5.1.0之前,在某些操作系统Windows上,此范围仅限于1970年1月1日至2038年1月19日

您正在运行什么版本的PHP?在哪个站台?也许是时候升级了

如果您在13 DEC 1901到19 J1 2038范围外使用日期,那么考虑使用PHP的DATETIME对象,这些对象可以使用更宽的日期范围。 程序性:

面向对象:


我是个书呆子,在使用strotime和explode时遇到了一些类似的问题。我偶然发现了这条线索,马克·贝克(Mark Baker)关于更改日期限制的评论对我帮助很大。谢谢!。所以我写这段代码只是为了玩弄这个概念。也许它会帮助像我这样的其他人

只需更改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>

为了适应现代,64位系统上的PHP7 strotime几乎可以处理任何广告日期,尽管出于某种原因,手册页上仍然显示1970年

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

Stamp: -15076350000
04/01/1492

结果

Stamp: 93142933200
08/01/4921

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

    <?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>"; } ?>
前两行的输出为:

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

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

我无法更改列类型。我在一个文本列中有几个值,其中一些是yyyy-mm-dd格式的日期。还有另一列指定行是包含日期值还是文本值。在这种情况下,您需要重新设计数据库。您是说,如果不重新设计数据库,就无法解决此问题吗?我只想将格式为yyyy mm dd的文本转换为日期格式F j,Y。例如:1820-05-20至1820年5月20日。日期完全没有问题。还有我写的解决方案。如果你在一列中有不同类型的数据,那么你已经破坏了整个数据库。没有解决方案,它会直接导致灾难谢谢-我使用的是Apache Solr搜索引擎,因此使用mysql date_格式函数不是一个选项,因为所有日期都需要以YYYY-MM-DDTHH-MM-SSZ格式编制索引。然后必须使用PHP解析。我正在使用PHPAPI检索搜索结果,DateTime是一张罚单。编辑:对于其他使用ApacheSolr遇到这个问题的人来说,这可能是一个答案:@Mark:我有php5.2.6,strotime仍然显示1970年之前的空白日期。在5.1.0之前,您在哪里看到过。。。时间戳是一个有符号的整数;在1970-01-01 00:00:00 GMT之前,负值用于秒,并且从5.1.0开始在所有平台上使用。。。。。有关这一点的参考请参见备注页的备注部分2@Mark:谢谢!我错过了Notes部分。strotime返回时间戳,您的函数返回ISO 8601日期。这是一个极其重要的区别!的确,你是对的。然而@Ctroy所要求的是一种获得ISO 8601日期的方法,所以我想我的不精确是可以原谅的!虽然我使用的是PHP7.1.10,但这似乎对我不起作用,或者你是说这将永远改变1970年到1970年之前的任何日期?你使用的是什么操作系统?它是64位操作系统吗?它在Linux、FreeBSD和OSX上工作。strotime为1970年之前的日期生成负数日期。要超过65年,您需要64位版本。Windows 10 64位,当我复制您的代码时,它只显示stamp:听起来好像strotime返回false?如果windows落后于时代5年,我们会感到惊讶吗?很抱歉,我没有在windows系统上安装php,因此无法测试。我发现这非常有用,因为我不知道为什么它不起作用。请您删除与问题解决方案无关的所有样板代码,好吗?例如,所有HTML部分都与解决方案无关。如果答案与PHP的date_create函数有关,您可以随时添加指向该函数文档的链接,或者解释其工作原理。顺便说一下,我不知道您的解决方案是否有效,我没有检查。只是一些让你的答案更有用的建议;我添加了整个代码片段以提供上下文。再加上我的生日 m转换是在while语句中声明的变量。为了了解日期的来源,我展示了数据库中的选择。这里有太多的答案不能说明他们是如何得到解决方案的。我只是包括了怎么做。
$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
    <?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>"; } ?>