【问题标题】:PHP Convert timestamp to months and daysPHP将时间戳转换为月和日
【发布时间】:2011-01-12 14:10:30
【问题描述】:

如何转换两个日期之间的时间戳差异

$diff = abs(strtotime($date2) - strtotime($date1));

根据需要输出到月和天的数量:

$res = 4.05 //-> 4 months and 5 days

【问题讨论】:

  • 问题是我需要根据用户输入的生产日期、月份和年份来计算一个项目的年龄。精度是几个月。例如,4 岁 5 个月大。不好的是服务器是 PHP
  • 你需要让 PHP

标签: php date time timestamp


【解决方案1】:

这样的事情可能会奏效。我的数学可能有点不对劲。

$diff = abs(strtotime($date2) - strtotime($date1));

define('DAY',60*60*24, true);
define('MONTH',DAY*30, true);
define('YEAR',DAY*365, true);

$years = floor($diff / (YEAR));
$months = floor(($diff - $years * YEAR) / (MONTH));
$days = floor(($diff - $years * YEAR - $months*MONTH ) / (DAY));

【讨论】:

  • 我猜有 31 天的月份会有差异。
  • 并且永远不要在包含 2 月的时间跨度中尝试这种方法,因为它有时是 1 天,有时是 2 天。当然,如果精度不是那么重要,它会起作用
【解决方案2】:

随着月份长度的变化,您不能这样处理它 - 除非您想根据平均月份长度做出假设。如果您想要正确的差异,您需要使用实际日期,那么您可以使用 php date diff - http://www.php.net/manual/en/datetime.diff.php

【讨论】:

  • 不幸的是在 PHP 5 >= 5.3.0 中可用,否则我当然会。
【解决方案3】:

对于 PHP 5.3,您可能需要使用
http://de.php.net/manual/en/datetime.diff.php

对于较低版本,您可能需要使用以下内容: (简单的解决方案,不是最快或最好的)

$days = 0;
$months = 0;
$month = date("n", $time1);
while ($time1 < $time2)
{
    ++$days;
    if (date("n", $time1) != $month)
    {
        $month = date("n", $time1);
        $days = 0;
        $months++;
    }
    $time1 = mktime(0, 0, 0, date("n", $time1), date("j", $time1) + 1, date("Y"));
}

//免责声明:未经测试

【讨论】:

  • 现在应该是正确的(如果我没有再次混淆 date() 参数)
【解决方案4】:

时间戳实际上是自 Unix 纪元即 1970 年 1 月 1 日以来的秒数。因此时间戳的差异实际上是秒。因此,要将秒数转换为天数,您只需将其除以一天中的秒数,即 $Timestamp/(24x60x60)。本月相同 $Timestamp/(24x60x60x30)

【讨论】:

  • 假设您定义 1 个月等于 30 天。
【解决方案5】:

您将在这里面临的最大问题是定义月份。您是否要使用 4 周 = 1 个月、30 天 = 1 个月等...我很想将数字保留为天数,或者最多转换为周和天

【讨论】:

    【解决方案6】:

    我认为这在 php 中不可用。所以你将不得不使用整数除法(或正常除法)和模运算符。

    例如(示例使用小时而不是毫秒,但重复的技巧相同):

    $totalhours = 27;
    $days = round($totalhours / 24);
    $hours = $totalhours % 24;
    

    这将给出 $days = 1 和 $hours = 3

    如其他回复所述。查找月份比较困难,因为每月的天数不固定。

    【讨论】:

    • 我可以用 MySQL 查询做到这一点吗?
    • 不是所有的日子都有 24 小时。
    • Mysql 实际上有几个功能可以帮助你,这似乎是你正在寻找的(查看页面以了解其他几个有用的功能):dev.mysql.com/doc/refman/5.1/en/… 至于所有有 24 小时的日子:如果忽略闰秒,UTC 中的所有日子都有 24 小时,23 和 25 小时仅在 UTC 没有的夏令时发生
    【解决方案7】:

    您可能想看看DateTime.diff,因为它能够表达您在比较月份时对人类的期望(例如 01.01.2010 到 01.03.2010 是(正好)三个月的差异) .

    【讨论】:

      【解决方案8】:

      您可以使用这样的函数计算日期差异

      function diff_date_day($day , $month , $year , $day2 , $month2 , $year2){
        $timestamp = mktime(0, 0, 0, $month, $day, $year, 0);
        $timestamp2 = mktime(0, 0, 0, $month2, $month2, $year2);
        $diff = floor(($timestamp - $timestamp2) / (3600 * 24)); 
        return $diff; 
      }
      

      假设平均一个月是30天并计算月数。它可以满足某些需求(显示博客评论年龄等)而完全不适合其他需求。

      【讨论】:

        【解决方案9】:

        找到了一个使用 MySQL 计算月份的解决方案:

        SELECT TIMESTAMPDIFF(MONTH,'{$start_time_str}','{$end_time_str}') AS m

        感谢所有相关人员。

        【讨论】:

        • 很高兴您找到了您的问题的解决方案,但此解决方案并未解决您的问题中发布的问题,这就是在 PHP
        【解决方案10】:

        我知道这已经过时了,但我在寻找以“3 年和 6 个月”格式计算时间戳格式的给定 dob 的时差时遇到了它。我写了以下内容,可能有人会觉得有用。

        // Determine age
        $time_start = 'YOUR DOB';
        $time_end = strtotime('today');
        $years = 0;
        $months = 0;
        while ($time_start < $time_end){
            $tmp_time = strtotime('+ 1 year', $time_start);
            if ($tmp_time < $time_end){
                $years++;
                $time_start = $tmp_time;
            } else {
                $tmp_time = strtotime('+ 1 month', $time_start);
                if ($tmp_time < $time_end){
                    $months++;
                    $time_start = $tmp_time;
                } else {
                    $time_start = $time_end;
                }
            }
        }
        $age = $years.' years &amp; '.$months.' months';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-17
          • 2013-09-12
          • 2012-08-28
          • 1970-01-01
          • 2011-09-06
          相关资源
          最近更新 更多