Hướng dẫn diff month php - khác tháng php

Có cách nào để tìm sự khác biệt trong tháng trong PHP không? Tôi có đầu vào từ ngày 2003-10-17 và ngày 2004-03-24. Tôi cần tìm bao nhiêu tháng trong hai ngày này. Nói nếu 6 tháng, tôi chỉ cần đầu ra trong vài tháng. Cảm ơn vì đã hướng dẫn tôi cho sự khác biệt trong ngày.

Tôi tìm thấy giải pháp thông qua MySQL nhưng tôi cần nó trong PHP. Bất cứ ai cũng giúp tôi, cảm ơn trước.

S.L. Barth

8.08971 Huy hiệu vàng 50 Huy hiệu bạc63 Huy hiệu Đồng71 gold badges50 silver badges63 bronze badges

Hỏi ngày 21 tháng 4 năm 2010 lúc 9:08Apr 21, 2010 at 9:08

2

Cách dễ nhất mà không phát minh lại bánh xe. Điều này sẽ cung cấp cho bạn sự khác biệt đầy đủ hàng tháng. I E. Hai ngày dưới cách nhau gần 76 tháng, nhưng kết quả là 75 tháng.full months difference. I.e. the below two dates are almost 76 months apart, but the result is 75 months.

date_default_timezone_set['Asia/Tokyo'];  // you are required to set a timezone

$date1 = new DateTime['2009-08-12'];
$date2 = new DateTime['2003-04-14'];

$diff = $date1->diff[$date2];

echo [[$diff->format['%y'] * 12] + $diff->format['%m']] . " full months difference";

Đã trả lời ngày 21 tháng 4 năm 2010 lúc 9:52Apr 21, 2010 at 9:52

lừa dối ♦ lừa dốideceze

497K81 Huy hiệu vàng718 Huy hiệu bạc865 Huy hiệu Đồng81 gold badges718 silver badges865 bronze badges

10

Sau khi kiểm tra hàng tấn giải pháp, đưa tất cả vào một bài kiểm tra đơn vị, đây là những gì tôi đi ra với:

/**
 * Calculate the difference in months between two dates [v1 / 18.11.2013]
 *
 * @param \DateTime $date1
 * @param \DateTime $date2
 * @return int
 */
public static function diffInMonths[\DateTime $date1, \DateTime $date2]
{
    $diff =  $date1->diff[$date2];

    $months = $diff->y * 12 + $diff->m + $diff->d / 30;

    return [int] round[$months];
}

Ví dụ: nó sẽ trả về [các trường hợp thử nghiệm từ bài kiểm tra đơn vị]:

  • 01.11.2013 - 30.11.2013 - 1 tháng
  • 01.01.2013 - 31.12.2013 - 12 tháng
  • 31.01.2011 - 28.02.2011 - 1 tháng
  • 01.09.2009 - 01.05.2010 - 8 tháng
  • 01.01.2013 - 31.03.2013 - 3 tháng
  • 15.02.2013 - 15.04.2013 - 2 tháng
  • 01.02.1985 - 31.12.2013 - 347 tháng

THÔNG BÁO: Vì việc làm tròn nó với ngày, thậm chí một nửa tháng sẽ được làm tròn, điều này có thể dẫn đến vấn đề nếu bạn sử dụng nó với một số trường hợp. Vì vậy, không sử dụng nó cho những trường hợp như vậy, nó sẽ gây ra vấn đề cho bạn.

Ví dụ:

  • 02.11.2013 - 31.12.2013 sẽ trả về 2, không phải 1 [như mong đợi].

Đã trả lời ngày 18 tháng 11 năm 2013 lúc 11:53Nov 18, 2013 at 11:53

Valentin Despavalentin DespaValentin Despa

38.1K18 Huy hiệu vàng79 Huy hiệu bạc103 Huy hiệu Đồng18 gold badges79 silver badges103 bronze badges

2

Tôi chỉ muốn thêm điều này nếu bất cứ ai đang tìm kiếm một giải pháp đơn giản, tính đến mỗi tháng cảm động thay thế cho các tháng hoàn chỉnh, những tháng tròn hoặc một cái gì đó tương tự.

// Build example data
$timeStart = strtotime["2003-10-17"];
$timeEnd = strtotime["2004-03-24"];
// Adding current month + all months in each passed year
$numMonths = 1 + [date["Y",$timeEnd]-date["Y",$timeStart]]*12;
// Add/subtract month difference
$numMonths += date["m",$timeEnd]-date["m",$timeStart];

echo $numMonths;

Đã trả lời ngày 13 tháng 3 năm 2015 lúc 8:05Mar 13, 2015 at 8:05

MaxmaxMaX

1.68513 Huy hiệu bạc17 Huy hiệu đồng13 silver badges17 bronze badges

Wow, cách để lật đổ vấn đề ... làm thế nào về phiên bản này:

function monthsBetween[$startDate, $endDate] {
    $retval = "";

    // Assume YYYY-mm-dd - as is common MYSQL format
    $splitStart = explode['-', $startDate];
    $splitEnd = explode['-', $endDate];

    if [is_array[$splitStart] && is_array[$splitEnd]] {
        $difYears = $splitEnd[0] - $splitStart[0];
        $difMonths = $splitEnd[1] - $splitStart[1];
        $difDays = $splitEnd[2] - $splitStart[2];

        $retval = [$difDays > 0] ? $difMonths : $difMonths - 1;
        $retval += $difYears * 12;
    }
    return $retval;
}

NB: Không giống như một số giải pháp khác, điều này không phụ thuộc vào các chức năng ngày được thêm vào Php 5.3, vì nhiều máy chủ được chia sẻ chưa có.

Đã trả lời ngày 11 tháng 3 năm 2012 lúc 22:21Mar 11, 2012 at 22:21

ClwillclwillCLWill

Huy hiệu đồng 1481 Bạc5 Huy hiệu Đồng1 silver badge5 bronze badges

2

$datetime1 = date_create['2009-10-11'];

$datetime2 = date_create['2013-1-13'];

$interval = date_diff[$datetime1, $datetime2];

echo $interval->format['%a day %m month %y year'];

Đã trả lời ngày 6 tháng 10 năm 2016 lúc 6:41Oct 6, 2016 at 6:41

2

// get year and month difference

$a1 = '20170401';

$a2 = '20160101'

$yearDiff = [substr[$a1, 0, 4] - substr[$a2, 0, 4]];

$monthDiff = [substr[$a1, 4, 2] - substr[$a2, 4, 2]];

$fullMonthDiff = [$yearDiff * 12] + $monthDiff;

// fullMonthDiff = 16

Mikhail_Sam

9.55611 huy hiệu vàng57 Huy hiệu bạc87 Huy hiệu đồng11 gold badges57 silver badges87 bronze badges

Đã trả lời ngày 17 tháng 12 năm 2015 lúc 10:43Dec 17, 2015 at 10:43

Đây là phiên bản nâng cao của tôi của @Deceze Trả lời:

 /**
 * @param string $startDate
 * Current date is considered if empty string is passed
 * @param string $endDate
 * Current date is considered if empty string is passed
 * @param bool $unsigned
 * If $unsigned is true, difference is always positive, otherwise the difference might be negative
 * @return int
 */
public static function diffInFullMonths[$startDate, $endDate, $unsigned = false]
{
    $diff = [new DateTime[$startDate]]->diff[new DateTime[$endDate]];
    $reverse = $unsigned === true ? '' : '%r';
    return [[int] $diff->format["{$reverse}%y"] * 12] + [[int] $diff->format["{$reverse}%m"]];
}

Đã trả lời ngày 6 tháng 1 năm 2016 lúc 2:39Jan 6, 2016 at 2:39

EhsanehsanEhsan

99210 Huy hiệu bạc19 Huy hiệu đồng10 silver badges19 bronze badges

Cách tốt nhất.

function getIntervals[DateTime $from, DateTime $to]
{
    $intervals = [];
    $startDate = $from->modify['first day of this month'];
    $endDate = $to->modify['last day of this month'];
    while[$startDate < $endDate]{
        $firstDay = $startDate->format['Y-m-d H:i:s'];
        $startDate->modify['last day of this month']->modify['+1 day'];
        $intervals[] = [
            'firstDay' => $firstDay,
            'lastDay' => $startDate->modify['-1 second']->format['Y-m-d H:i:s'],
        ];
        $startDate->modify['+1 second'];
    }
    return $intervals;
}
$dateTimeFirst = new \DateTime['2013-01-01'];
$dateTimeSecond = new \DateTime['2013-03-31'];
$interval = getIntervals[$dateTimeFirst, $dateTimeSecond];
print_r[$interval];

Result:

Array
[
    [0] => Array
        [
            [firstDay] => 2013-01-01 00:00:00
            [lastDay] => 2013-01-31 23:59:59
        ]

    [1] => Array
        [
            [firstDay] => 2013-02-01 00:00:00
            [lastDay] => 2013-02-28 23:59:59
        ]

    [2] => Array
        [
            [firstDay] => 2013-03-01 00:00:00
            [lastDay] => 2013-03-31 23:59:59
        ]

]

Đã trả lời ngày 18 tháng 2 năm 2016 lúc 8:56Feb 18, 2016 at 8:56

LebniklebnikLebnik

6318 Huy hiệu bạc11 Huy hiệu đồng8 silver badges11 bronze badges

Trong trường hợp của tôi, tôi cần đếm thức ăn thừa đầy đủ tháng và ngày là tháng để xây dựng nhãn biểu đồ dòng.

/**
 * Calculate the difference in months between two dates
 *
 * @param \DateTime $from
 * @param \DateTime $to
 * @return int
 */
public static function diffInMonths[\DateTime $from, \DateTime $to]
{
    // Count months from year and month diff
    $diff = $to->diff[$from]->format['%y'] * 12 + $to->diff[$from]->format['%m'];

    // If there is some day leftover, count it as the full month
    if [$to->diff[$from]->format['%d'] > 0] $diff++;

    // The month count isn't still right in some cases. This covers it.
    if [$from->format['d'] >= $to->format['d']] $diff++;
}

Đã trả lời ngày 11 tháng 3 năm 2016 lúc 8:30Mar 11, 2016 at 8:30

John Linhartjohn LinhartJohn Linhart

1.61619 huy hiệu bạc21 Huy hiệu đồng19 silver badges21 bronze badges

/**
 * Calculate the difference in months between two dates [v1 / 18.11.2013]
 *
 * @param \DateTime $date1
 * @param \DateTime $date2
 * @return int
 */
public static function diffInMonths[\DateTime $date1, \DateTime $date2]
{
    $diff =  $date1->diff[$date2];

    $months = $diff->y * 12 + $diff->m + $diff->d / 30;

    return [int] round[$months];
}
0

Tham khảo: //au.php.net/manual/en/function.mktime.php#86916

Đã trả lời ngày 21 tháng 4 năm 2010 lúc 9:32Apr 21, 2010 at 9:32

Russell Diasrussell DiasRussell Dias

68.4K5 Huy hiệu vàng 50 Huy hiệu bạc71 Huy hiệu đồng5 gold badges50 silver badges71 bronze badges

1

/**
 * Calculate the difference in months between two dates [v1 / 18.11.2013]
 *
 * @param \DateTime $date1
 * @param \DateTime $date2
 * @return int
 */
public static function diffInMonths[\DateTime $date1, \DateTime $date2]
{
    $diff =  $date1->diff[$date2];

    $months = $diff->y * 12 + $diff->m + $diff->d / 30;

    return [int] round[$months];
}
1

Đã trả lời ngày 11 tháng 1 năm 2012 lúc 17:14Jan 11, 2012 at 17:14

1

Đây là một điều nhanh chóng:

/**
 * Calculate the difference in months between two dates [v1 / 18.11.2013]
 *
 * @param \DateTime $date1
 * @param \DateTime $date2
 * @return int
 */
public static function diffInMonths[\DateTime $date1, \DateTime $date2]
{
    $diff =  $date1->diff[$date2];

    $months = $diff->y * 12 + $diff->m + $diff->d / 30;

    return [int] round[$months];
}
2

Đã trả lời ngày 21 tháng 4 năm 2010 lúc 9:19Apr 21, 2010 at 9:19

TowertowerTower

94.9K126 Huy hiệu vàng346 Huy hiệu bạc 502 Huy hiệu đồng126 gold badges346 silver badges502 bronze badges

2

Không phải là câu trả lời bạn đang tìm kiếm? Duyệt các câu hỏi khác được gắn thẻ DateTime ngày hoặc đặt câu hỏi của riêng bạn.

Bài Viết Liên Quan

Chủ Đề