PHP将时间戳转换为月份和天数

4
如何将两个日期之间的时间戳差转换?
$diff = abs(strtotime($date2) - strtotime($date1));

将月份和天数数量按要求输出:

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

问题是我需要根据用户输入的生产日期、月份和年份来计算一个物品的年龄。精度为月。例如,4年5个月大。不好的是服务器是PHP < 5.3.0,所以我无法使用DateTime diff函数。 - Blackbeard
你需要在问题中更突出地提到PHP < 5.3,比如在标题中。 - Myer
10个回答

8

可能有类似这样的解决方案。我的数学可能有点偏差。

$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天的情况会有所不同。 - Blackbeard
2
不要尝试对包含二月的时间跨度进行操作,因为有时会相差1天,有时会相差2天。当然,如果精度不是那么重要,这种方法也可以使用。 - user253984

4

你不能这样处理,因为月份的长度会有所不同,除非你想基于平均月份长度做出假设。如果您想要正确的差异,您需要使用实际日期,然后可以使用PHP的date_diff函数 - http://www.php.net/manual/en/datetime.diff.php


很不幸,此功能仅适用于 PHP 5 >= 5.3.0,否则我当然会使用它。 - Blackbeard

3

如果您使用的是PHP 5.3,您可能需要使用
http://de.php.net/manual/en/datetime.diff.php

如果您使用的是更低版本的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()参数)。 - user253984

2

时间戳实际上是自Unix纪元开始的秒数,即1970年1月1日。因此,时间戳之间的差异实际上是以秒为单位的。因此,要将秒转换为天,您只需将其除以一天的秒数,即$Timestamp/(24x60x60)。同样适用于一个月的情况,$ Timestamp /(24x60x60x30)


假设您将一个月定义为30天。 - ZombieSheep

1
你可以使用下面这个函数来计算两个日期之间的天数差异:
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天,然后计算月数。这对于一些需求可能足够(例如显示博客评论的年龄等),但对于其他需求则完全不适用。


1
你在这里面临的最大问题是如何定义月份。你会使用4周=1个月,30天=1个月等吗?我倾向于将数字保留为天数,或者最多转换为周和天数。

1

我认为在php中没有这个功能。因此,您将不得不使用整数除法(或普通除法)和模运算符。

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

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

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

如其他回复所述,找到月份更难,因为每个月的天数不是固定的。


我能用MySQL查询来做到这一点吗? - Blackbeard
不是所有的日子都有24小时。 - rjp
MySQL实际上有几个可以帮助你的函数,这个似乎是你正在寻找的(查看页面以获取其他有用的函数):http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff至于所有的一天都有24小时:如果忽略闰秒,UTC中的所有日子都有24小时,在夏令时期间只会出现23和25小时,而UTC没有夏令时。 - Thirler

1

你可能想要查看DateTime.diff,因为它能够表达人类在比较月份时所期望的差异(例如,从2010年01月01日到2010年03月01日的差异为(恰好)三个月)。


0

我知道这已经过时了,但当我在寻找一些东西来计算给定时间戳格式的出生日期与当前日期之间的时间差(以“3年6个月”的格式)时,我偶然发现了这篇文章。我写了下面的代码,希望对某些人有所帮助。

// 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';

0

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

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

感谢所有参与其中的人。


2
很高兴你找到了解决你自己的问题的方法,但是这个解决方案并没有解决你在问题中提出的问题,即如何在PHP < 5.3中找到月份差异。这篇文章仍然没有解决... - Myer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接