【问题标题】:Get seconds from a date to end of month PHP获取从日期到月底 PHP 的秒数
【发布时间】:2019-06-19 15:49:32
【问题描述】:

从我们希望客户在一年后的月底之前付款的 sql 数据库表中提取订阅日期。订阅只是一个月内的某个日期。一年后的部分很容易,找出那个月底在哪里,并在几秒钟内将它添加到一年的部分给我带来了问题。

日期存储为从 unix 归零开始的秒数。如何找到从该值到该月月底的秒数?我尝试使用 m-i-Y 将日期值转换为实际日期

月末:

$expDate = date('m-i-Y',$row1["renewDate"]);

这行得通。我以字符串形式获得该月的最后一天。但如果我尝试:

$endOfMonth = strtotime($expDate);

没用……

echo'ing $expDate 以字符串形式显示该月的最后一天。

回显$endOfMonth 什么都不返回...

感谢您对此的任何想法。

【问题讨论】:

  • i 表示分钟(带前导零)。我想您希望t 找到该月的最后一天。 Docs。如果你真的想把事情精确到秒,你也必须将$expDate 强制到午夜。

标签: php seconds


【解决方案1】:

strtotime 不适用于任意日期格式。你有两个选择:

  1. 使用date_create_from_format 解析自定义日期格式。
  2. 将您的字符串转换为Y-m-d 可以理解的strtotime 格式 自动。

例如:

$date = date('Y-m-t', $row1["renewDate"]);
$timestamp = strtotime($date);

附:如 cmets 所述,您应该使用 t 而不是 i

【讨论】:

    【解决方案2】:

    你可以玩这样的东西。如果数据库有纪元时间,那么您可以使用“@”符号将其转换为日期。您可以通过这种方式获取订阅日期,也可以使用 m/t/Y 获取订阅月的结束日期。您可以使用 get Timestamp 将其转换回 DT,然后再转换为 UNIX 时间。看起来它适用于时间 = 1560961801。

    $row1["renewDate"] = 1560961801;
    $unixfromDB = $row1["renewDate"];
    
    $date = new DateTime('@' .$unixfromDB); // your UNIX timestamp.     
    $subdate =  $date->format( 'm/d/Y' ); // subscription date
    
    $endmonth = $date->format( 'm/t/Y' ); // end of month date
    $endmonth = DateTime::createFromFormat('m/d/Y', $endmonth);
    $endmonth = $endmonth->getTimestamp();  // UNIX timestamp for end of month.
    
    echo ($endmonth - $unixfromDB) / (60 * 60 *24);  // days to end of month
    

    【讨论】:

      【解决方案3】:

      尝试使用mktime() 而不是strtotime()

      <?
      /* establish variables */
      $now=time();    // epoch seconds right now
      $expDate = date('m-t-Y', $row1["renewDate"]);   //note the switch to 't' as suggested by @ehymel
      $eom = mktime($expDate);    // converts 'end of month' date into epoch seconds
      
      /* results */
      $secondsleft = $eom - $now;     // number of seconds until the end of the month
      echo $secondsleft;  // return results
      ?>
      

      【讨论】:

      • 谢谢大家,是的,'i' 是一个错字... mktime($expDate) 工作(我以为我试过了...哦)...这是最简单的,可以做什么我需要。再次感谢大家!
      • 希望您在我的回答中打勾。很高兴这对你有用。谢谢!
      【解决方案4】:

      mktime($expDate) 不幸的是没有用,至少在 CentOS6.9 中是这样。即使使用 expdate 变量,它仍然返回当前系统时间。

      使用 strtotime 可以识别的日期格式 Y-m-t 确实可以正常工作。感谢 user1597430...

      【讨论】:

        猜你喜欢
        • 2015-09-24
        • 2011-07-26
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-26
        • 1970-01-01
        相关资源
        最近更新 更多