কীভাবে পিএইচপি ব্যবহার করে দুটি তারিখের মধ্যে পার্থক্য গণনা করবেন?


722

আমার ফর্মটির দুটি তারিখ রয়েছে:

Start Date: 2007-03-24 
End Date: 2009-06-26

এখন আমাকে নিম্নলিখিত ফর্মটিতে এই দুটিয়ের মধ্যে পার্থক্যটি সন্ধান করতে হবে:

2 years, 3 months and 2 days

আমি কীভাবে এই পিএইচপি করতে পারি?


1
2 বছর 94 দিন। মাসগুলি গণনা করা, অ্যাকাউন্টে লাফিয়ে যাওয়ার বছর গ্রহণ করা সমস্যাযুক্ত হবে। এটি কতটা সঠিক হওয়া দরকার?
dbasnett

উত্তর:


526

লিগ্যাসি কোডের জন্য এটি ব্যবহার করুন (পিএইচপি <5.3)। আপ টু ডেট সমাধানের জন্য নীচে জুরকার উত্তর দেখুন

আপনি দুটি তারিখকে ইউনিক্স সময়ে রূপান্তর করতে স্ট্রোটোটাইম () ব্যবহার করতে পারেন এবং তারপরে তাদের মধ্যে সেকেন্ডের সংখ্যা গণনা করতে পারেন। এ থেকে বিভিন্ন সময়কাল গণনা করা বরং সহজ।

$date1 = "2007-03-24";
$date2 = "2009-06-26";

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

$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));

printf("%d years, %d months, %d days\n", $years, $months, $days);

সম্পাদনা করুন: অবশ্যই এটি করার পছন্দের উপায়টি নীচের জুরকা দ্বারা বর্ণিত মত। আমার কোডটি কেবলমাত্র তখনই প্রস্তাবিত হয় যদি আপনার পিএইচপি 5.3 বা তার চেয়ে ভাল না থাকে।

মন্তব্যে বেশিরভাগ লোক উল্লেখ করেছেন যে উপরের কোডটি কেবল একটি আনুমানিক। আমি এখনও বিশ্বাস করি যে বেশিরভাগ উদ্দেশ্যগুলির জন্য এটি ঠিক আছে, যেহেতু পরিসীমা ব্যবহারের ফলে নির্ভুলতা প্রদানের চেয়ে কতটা সময় কেটে গেছে বা এখনও থেকে যায় তার একটি ধারণা প্রদান করা - যদি আপনি এটি করতে চান তবে কেবল তারিখটি আউটপুট করুন।

এত কিছুর পরেও, আমি অভিযোগগুলি সমাধান করার সিদ্ধান্ত নিয়েছি। আপনার যদি সত্যই একটি সঠিক পরিসীমা প্রয়োজন তবে পিএইচপি 5.3 এ অ্যাক্সেস না পেয়ে থাকেন, নীচের কোডটি ব্যবহার করুন (এটি পিএইচপি 4 তেও কাজ করা উচিত)। এটি কোডের প্রত্যক্ষ পোর্ট যা পিএইচপি অভ্যন্তরীণভাবে রেঞ্জগুলি গণনা করতে ব্যবহার করে, ব্যতিক্রমটি যে এটি দিবালোকের সঞ্চয় সময় বিবেচনায় নেয় না। তার মানে এটি এক ঘন্টার মধ্যে সর্বাধিক বন্ধ হয়ে গেছে তবে এটি ব্যতীত এটি সঠিক হওয়া উচিত।

<?php

/**
 * Calculate differences between two dates with precise semantics. Based on PHPs DateTime::diff()
 * implementation by Derick Rethans. Ported to PHP by Emil H, 2011-05-02. No rights reserved.
 * 
 * See here for original code:
 * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/tm2unixtime.c?revision=302890&view=markup
 * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/interval.c?revision=298973&view=markup
 */

function _date_range_limit($start, $end, $adj, $a, $b, $result)
{
    if ($result[$a] < $start) {
        $result[$b] -= intval(($start - $result[$a] - 1) / $adj) + 1;
        $result[$a] += $adj * intval(($start - $result[$a] - 1) / $adj + 1);
    }

    if ($result[$a] >= $end) {
        $result[$b] += intval($result[$a] / $adj);
        $result[$a] -= $adj * intval($result[$a] / $adj);
    }

    return $result;
}

function _date_range_limit_days($base, $result)
{
    $days_in_month_leap = array(31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $days_in_month = array(31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    _date_range_limit(1, 13, 12, "m", "y", &$base);

    $year = $base["y"];
    $month = $base["m"];

    if (!$result["invert"]) {
        while ($result["d"] < 0) {
            $month--;
            if ($month < 1) {
                $month += 12;
                $year--;
            }

            $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
            $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];

            $result["d"] += $days;
            $result["m"]--;
        }
    } else {
        while ($result["d"] < 0) {
            $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
            $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];

            $result["d"] += $days;
            $result["m"]--;

            $month++;
            if ($month > 12) {
                $month -= 12;
                $year++;
            }
        }
    }

    return $result;
}

function _date_normalize($base, $result)
{
    $result = _date_range_limit(0, 60, 60, "s", "i", $result);
    $result = _date_range_limit(0, 60, 60, "i", "h", $result);
    $result = _date_range_limit(0, 24, 24, "h", "d", $result);
    $result = _date_range_limit(0, 12, 12, "m", "y", $result);

    $result = _date_range_limit_days(&$base, &$result);

    $result = _date_range_limit(0, 12, 12, "m", "y", $result);

    return $result;
}

/**
 * Accepts two unix timestamps.
 */
function _date_diff($one, $two)
{
    $invert = false;
    if ($one > $two) {
        list($one, $two) = array($two, $one);
        $invert = true;
    }

    $key = array("y", "m", "d", "h", "i", "s");
    $a = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $one))));
    $b = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $two))));

    $result = array();
    $result["y"] = $b["y"] - $a["y"];
    $result["m"] = $b["m"] - $a["m"];
    $result["d"] = $b["d"] - $a["d"];
    $result["h"] = $b["h"] - $a["h"];
    $result["i"] = $b["i"] - $a["i"];
    $result["s"] = $b["s"] - $a["s"];
    $result["invert"] = $invert ? 1 : 0;
    $result["days"] = intval(abs(($one - $two)/86400));

    if ($invert) {
        _date_normalize(&$a, &$result);
    } else {
        _date_normalize(&$b, &$result);
    }

    return $result;
}

$date = "1986-11-10 19:37:22";

print_r(_date_diff(strtotime($date), time()));
print_r(_date_diff(time(), strtotime($date)));

1
আপনি যদি ডেটটাইম ক্লাস ব্যবহার করছেন তবে আপনি ইউনিক্স টাইমস্ট্যাম্প পেতে $ তারিখ-> ফর্ম্যাট ('ইউ') যেতে পারেন।
জন ক্র্যাম 13

4
গ্রীষ্ম / শীতের সময় যদি আপনার মোকাবেলা করতে হয় তবে এটি সত্য নয়। এই বিশেষ ক্ষেত্রে যখন আপনি গ্রীষ্ম / শীতের সময় সামঞ্জস্য করেন, একদিনের পরিমাণ 23 বা 25 ঘন্টা হয়।
আরনো

4
ঠিক আছে, একই তর্কটি লিপ বছরের জন্য তৈরি করা যেতে পারে। এটিও আমলে নেয় না। তবুও, আমি এখানে বিশ্বাস করি না যে আপনি এখানে একটি পরিসীমা নিয়ে আলোচনা করার কারণে আপনি এমনকি এটি অ্যাকাউন্টে নিতে চান। কোনও পরিসরের জন্য শব্দার্থক শব্দগুলি পরম তারিখের চেয়ে কিছুটা আলাদা।
এমিল এইচ

9
এই ফাংশনটি ভুল। এটি একটি আনুমানিক জন্য ভাল, কিন্তু সঠিক ব্যাপ্তি জন্য ভুল। একটির জন্য, এটি ধরে নেওয়া হয় যে মাসে মাসে 30 দিন থাকে, যা বলে যে 1 ই ফেব্রুয়ারি থেকে 1 ই মার্চ এর মধ্যে একই পার্থক্য থাকবে যেমন 1 জুলাই থেকে 1 ই আগস্ট (লিপ বছর নির্বিশেষে) হবে।
এনওব্রেভ

1
পিএইচপি-তে, রেফারেন্স ভেরিয়েবলগুলি ফাংশনের স্বাক্ষরে থাকে, কল নয়। আপনার সমস্ত &স্বাক্ষরে সরান ।
পল টারজান

909

আমি ডেটটাইম এবং ডেটইন্টারওয়াল অবজেক্ট ব্যবহার করার পরামর্শ দিই।

$date1 = new DateTime("2007-03-24");
$date2 = new DateTime("2009-06-26");
$interval = $date1->diff($date2);
echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; 

// shows the total amount of days (not divided into years, months and days like above)
echo "difference " . $interval->days . " days ";

আরও পড়ুন পিএইচপি ডেটটাইম :: বিভিন্ন ম্যানুয়াল

ম্যানুয়াল থেকে:

পিএইচপি 5.2.2 হিসাবে, ডেটটাইম অবজেক্টগুলি তুলনা অপারেটরগুলি ব্যবহার করে তুলনা করা যেতে পারে।

$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2); // bool(false)
var_dump($date1 < $date2);  // bool(true)
var_dump($date1 > $date2);  // bool(false)

14
+1 ডেটটাইম লিপ বছর এবং সময় অঞ্চলগুলি সঠিকভাবে পরিচালনা করে এবং তাকটির জন্য একটি ভাল বই রয়েছে: phparch.com/books/…
হ্যাক্রে

3
এমন কোনও পদ্ধতি আছে যা দুটি ডেটটাইমগুলির মধ্যে সেকেন্ডের মোট সংখ্যা দেয়? (উপাদানগুলি যোগ না করেই, তা হ'ল)
আলু

1
@ পানিক $ বিরতি-> দিন এবং $ বিরতি-> ডি বিভিন্ন পদক্ষেপ। উপরে আপনার মন্তব্য ঠিক আছে "দিনগুলির মোট পরিমাণ দেখায় (বছর, মাস এবং দিনের মতো দিনগুলিতে বিভক্ত নয়)"
জুরকা

1
@potatoe আপনি সম্ভবত চান $date2->format('U') - $date1->format('U')
পাওলো ফ্রেইটাস

3
নোট সেখানে একটি বাগ যেখানে DateInterval একটি ভুল দিন সম্পত্তি (হয়েছে যে সবসময় 6015 ) উইন্ডোজ কিছু পিএইচপি সংস্করণের সাথে: bugs.php.net/bug.php?id=51184 (ফিক্স / কার্যসংক্রান্ত সেখানে মন্তব্য দেখুন)
পিম Schaaf

73

কর্মের সর্বোত্তম কোর্স হ'ল পিএইচপি'র DateTime(এবং DateInterval) অবজেক্ট ব্যবহার করা। প্রতিটি তারিখ একটি DateTimeবস্তুতে আবদ্ধ হয় , এবং তারপরে উভয়ের মধ্যে একটি পার্থক্য করা যেতে পারে:

$first_date = new DateTime("2012-11-30 17:03:30");
$second_date = new DateTime("2012-12-21 00:00:00");

DateTimeবস্তু গ্রহণ করবে কোনো বিন্যাসে strtotime()would। যদি আরও নির্দিষ্ট তারিখের ফর্ম্যাট প্রয়োজন DateTime::createFromFormat()হয় তবে DateTimeঅবজেক্টটি তৈরি করতে ব্যবহার করা যেতে পারে ।

উভয় বস্তু তাত্ক্ষণিকভাবে চালিত হওয়ার পরে, আপনি অন্যটির সাথে একটিটির সাথে বিয়োগ করে DateTime::diff()

$difference = $first_date->diff($second_date);

$differenceDateIntervalপার্থক্য সম্পর্কিত তথ্য সহ এখন একটি বিষয় ধারণ করে । এর var_dump()মতো দেখতে:

object(DateInterval)
  public 'y' => int 0
  public 'm' => int 0
  public 'd' => int 20
  public 'h' => int 6
  public 'i' => int 56
  public 's' => int 30
  public 'invert' => int 0
  public 'days' => int 20

DateIntervalঅবজেক্টটি ফর্ম্যাট করতে আমাদের প্রতিটি মান পরীক্ষা করতে হবে এবং যদি 0 হয়:

/**
 * Format an interval to show all existing components.
 * If the interval doesn't have a time component (years, months, etc)
 * That component won't be displayed.
 *
 * @param DateInterval $interval The interval
 *
 * @return string Formatted interval string.
 */
function format_interval(DateInterval $interval) {
    $result = "";
    if ($interval->y) { $result .= $interval->format("%y years "); }
    if ($interval->m) { $result .= $interval->format("%m months "); }
    if ($interval->d) { $result .= $interval->format("%d days "); }
    if ($interval->h) { $result .= $interval->format("%h hours "); }
    if ($interval->i) { $result .= $interval->format("%i minutes "); }
    if ($interval->s) { $result .= $interval->format("%s seconds "); }

    return $result;
}

এখন যা যা রয়েছে তা হ'ল আমাদের ফাংশনটি $difference DateIntervalঅবজেক্টটিতে কল করা :

echo format_interval($difference);

এবং আমরা সঠিক ফলাফল পেয়েছি:

20 দিন 6 ঘন্টা 56 মিনিট 30 সেকেন্ড

লক্ষ্য অর্জনে ব্যবহৃত সম্পূর্ণ কোড:

/**
 * Format an interval to show all existing components.
 * If the interval doesn't have a time component (years, months, etc)
 * That component won't be displayed.
 *
 * @param DateInterval $interval The interval
 *
 * @return string Formatted interval string.
 */
function format_interval(DateInterval $interval) {
    $result = "";
    if ($interval->y) { $result .= $interval->format("%y years "); }
    if ($interval->m) { $result .= $interval->format("%m months "); }
    if ($interval->d) { $result .= $interval->format("%d days "); }
    if ($interval->h) { $result .= $interval->format("%h hours "); }
    if ($interval->i) { $result .= $interval->format("%i minutes "); }
    if ($interval->s) { $result .= $interval->format("%s seconds "); }

    return $result;
}

$first_date = new DateTime("2012-11-30 17:03:30");
$second_date = new DateTime("2012-12-21 00:00:00");

$difference = $first_date->diff($second_date);

echo format_interval($difference);

DateTime()এটি কোনও ফাংশন নয়, এটি একটি অবজেক্ট এবং এটি পিএইচপি 5.2 থেকে রয়েছে। আপনার সার্ভার এটি সমর্থন করে তা নিশ্চিত করুন।
মাদারার ভূত

2
@ সেকেন্ড রিকুডো ডেটটাইম :: ডিফের প্রয়োজন পিএইচপি 5.3.0
ফোনিক্স

আমাদের সমস্যা আছে, ফার্স্ট_সেটকে দ্বিতীয়_ তারিখে বিনিময় করুন এবং আমরা একই ফল পাচ্ছি? 0 দিন 0 ঘন্টা 0 মিনিট 0 সেকেন্ড বা কেবল 0. কেন বলবেন না উদাহরণ: 2012-11-30 17:03:30 - 2012-12-21 00:00:00 এবং 2012-12-21 00:00:00 - 2012-11-30 17:03:30 একই ফলাফল পান।
অহমিকা ডেভেলপার

কারণ ডিফ আপনাকে দুটি সময়ের মধ্যে পার্থক্য দেয়। কোন তারিখ পরে আসে তা নির্বিশেষে পার্থক্য 0 নয়।
মাদারার ভূত

1
এই হল সত্যিই ভাল উত্তর যেমন একটি স্পষ্ট ফাংশন যে একটি কোডবেস যে কোন জায়গা থেকে সময় calcs প্রচুর ছাড়া বলা যেতে পারে প্রদান করে। অন্যের উত্তরগুলি আপনাকে ফ্লাইতে প্রতিধ্বনিযুক্ত ক্যালকগুলি ফেলে দেওয়ার অনুমতি দেয় যা সমস্যার সমাধানের পরিবর্তে লক্ষণগুলিকে সম্বোধন করে ... আমি যে একমাত্র উপাদান যুক্ত করেছি (এবং অন্যান্য সমস্ত পোস্ট এটি আবরণ করে না) হ'ল অন্তর্বর্তী উপাদানগুলির বহুবচন যদি 1 এরও বেশি হয়
নিখর

33

সময় এবং মিনিট এবং সেকেন্ড দেখুন ..

$date1 = "2008-11-01 22:45:00"; 

$date2 = "2009-12-04 13:44:01"; 

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

$years   = floor($diff / (365*60*60*24)); 
$months  = floor(($diff - $years * 365*60*60*24) / (30*60*60*24)); 
$days    = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));

$hours   = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24)/ (60*60)); 

$minuts  = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60); 

$seconds = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minuts*60)); 

printf("%d years, %d months, %d days, %d hours, %d minuts\n, %d seconds\n", $years, $months, $days, $hours, $minuts, $seconds); 

7
সম্ভবত এটি সঠিক ফলাফল দেয় না।
ডলফিন

8
এবং একটি ভয়াবহ সমাধান যদি না আপনি পিএইচপি-র একটি অতি পুরানো সংস্করণ ব্যবহার করতে বাধ্য হন ...
rdlowrey

2
এতটা শুকনো নয় । উদাহরণস্বরূপ, 60 * 60 * 24 15 বার পুনরাবৃত্তি করা হয়। দীর্ঘ লাইভ কপি-পেস্ট পুনঃব্যবহার!
পিটার মর্টেনসেন

লিপ বছর সম্পর্কে কি? একটি বছর গড়ে 365 দিন নয়।
পিটার মর্টেনসেন

এই কোডটি ধরে নিয়েছে একটি মাস গড়ে 30 দিন। এমনকি এক বছরের জন্য ৩5৫ দিন ধরেও, গড়ে মাসে 365/12 = 30.42 দিন (আনুমানিক)।
পিটার মর্টেনসেন

18

নীচের লিঙ্কটি একবার দেখুন। এটি আমি এখনও অবধি খুঁজে পাওয়া সেরা উত্তর .. :)

function dateDiff ($d1, $d2) {

    // Return the number of days between the two dates:    
    return round(abs(strtotime($d1) - strtotime($d2))/86400);

} // end function dateDiff

আপনি তারিখের প্যারামিটারগুলিতে পাস করার পরে কোন তারিখের আগের বা পরে তা গুরুত্বপূর্ণ নয়। দুটি তারিখের মধ্যে দিনের সংখ্যা হিসাবে সর্বদা একটি ইতিবাচক সংখ্যা ফেরত দিতে ফাংশনটি পিএইচপি এবিএস () নিরঙ্কুশ মানটি ব্যবহার করে।

মনে রাখবেন যে দুটি তারিখের মধ্যে দিনের সংখ্যা উভয় তারিখের অন্তর্ভুক্ত নয়। সুতরাং আপনি যদি প্রবেশের তারিখগুলির মধ্যে এবং সমস্ত তারিখগুলি সহ সমস্ত তারিখগুলি দ্বারা প্রতিনিধিত্ব করা দিনের সন্ধান করে থাকেন তবে আপনাকে এই ফাংশনের ফলাফলের জন্য একটি (1) যুক্ত করতে হবে।

উদাহরণস্বরূপ, 2013-02-09 এবং 2013-02-14 এর মধ্যে পার্থক্যটি (উপরের ফাংশন দ্বারা ফেরত হিসাবে) 5 হয় তবে 2013-02-09 - 2013-02- তারিখের সীমা দ্বারা প্রতিনিধিত্ব করা দিন বা তারিখের সংখ্যা is 14 হ'ল 6।

http://www.bizinfosys.com/php/date-difference.html


প্রশ্নটি বছরের বেশিরভাগ দিন, মাস এবং দিন হিসাবে সংখ্যা হিসাবে পার্থক্য চেয়েছিল।
পিটার মর্টেনসেন

14

আমি এর পক্ষে ভোট দিয়েছি jurka এর উত্তর হিসাবে যে আমার প্রিয়, কিন্তু আমি একটি প্রি-php.5.3 সংস্করণ আছে ...

আমি নিজেকে একটি অনুরূপ সমস্যায় কাজ করতে দেখলাম - যা এই প্রশ্নটিতে আমি প্রথম স্থানে এসেছি - তবে কয়েক ঘন্টার মধ্যে কেবল একটি পার্থক্য প্রয়োজন। তবে আমার ফাংশনটি এটি খুব সুন্দরভাবে সমাধান করেছে এবং আমার নিজের লাইব্রেরিতে এটি কোথাও নেই যাতে এটি হারিয়ে যায় এবং ভুলে যায় না, তাই ... আশা করি এটি কারও পক্ষে কার্যকর।

/**
 *
 * @param DateTime $oDate1
 * @param DateTime $oDate2
 * @return array 
 */
function date_diff_array(DateTime $oDate1, DateTime $oDate2) {
    $aIntervals = array(
        'year'   => 0,
        'month'  => 0,
        'week'   => 0,
        'day'    => 0,
        'hour'   => 0,
        'minute' => 0,
        'second' => 0,
    );

    foreach($aIntervals as $sInterval => &$iInterval) {
        while($oDate1 <= $oDate2){ 
            $oDate1->modify('+1 ' . $sInterval);
            if ($oDate1 > $oDate2) {
                $oDate1->modify('-1 ' . $sInterval);
                break;
            } else {
                $iInterval++;
            }
        }
    }

    return $aIntervals;
}

এবং পরীক্ষা:

$oDate = new DateTime();
$oDate->modify('+111402189 seconds');
var_dump($oDate);
var_dump(date_diff_array(new DateTime(), $oDate));

এবং ফলাফল:

object(DateTime)[2]
  public 'date' => string '2014-04-29 18:52:51' (length=19)
  public 'timezone_type' => int 3
  public 'timezone' => string 'America/New_York' (length=16)

array
  'year'   => int 3
  'month'  => int 6
  'week'   => int 1
  'day'    => int 4
  'hour'   => int 9
  'minute' => int 3
  'second' => int 8

আমি থেকে মূল ধারণা পেয়েছেন এখানে যা আমি আমার ব্যবহারের জন্য পরিবর্তন, (এবং আমি আশা করি আমার পরিমার্জন পাশাপাশি যে পৃষ্ঠাতে দেখাবেন হবে)।

$aIntervalsঅ্যারে থেকে মুছে ফেলা বা " $aExcludeপ্যারামিটার " যুক্ত করে আপনি খুব সহজেই ("সপ্তাহ" বলুন) চান না এমন অন্তরগুলি সরিয়ে ফেলতে পারেন বা স্ট্রিং আউটপুট করার সময় কেবল এগুলি ফিল্টার আউট করতে পারেন।


দুর্ভাগ্যক্রমে বছর / মাসের অতিরিক্ত প্রবাহের কারণে এটি ডেটইন্টারওয়াল হিসাবে একই জিনিস ফেরত দেয় না।
স্টিফেন হ্যারিস

2
@ স্টেফেনহরিস: আমি এটি পরীক্ষা করিনি, তবে কোডটি পড়ে আমি পুরোপুরি আত্মবিশ্বাসী যে একই ফলাফলটি ফিরে আসতে পারে - তবে আপনি যদি weekসূচকটি মুছে ফেলেন $aIntervals(যেহেতু এটি DateDiffকখনই ব্যবহার করে না)।
অ্যালিক্স অ্যাক্সেল

এটি দুটি তারিখের মধ্যে প্রতি বিরতিতে ঘটে এমন তারিখগুলি সন্ধানের জন্য দুর্দান্ত সমাধান।
betweenbrain

14
<?php
    $today = strtotime("2011-02-03 00:00:00");
    $myBirthDate = strtotime("1964-10-30 00:00:00");
    printf("Days since my birthday: ", ($today - $myBirthDate)/60/60/24);
?>

প্রশ্নটি বছর , মাস এবং দিনের সংখ্যা হিসাবে পার্থক্য জানতে চেয়েছিল । এটি দিনের মোট সংখ্যা হিসাবে পার্থক্যটিকে আউটপুট করে।
পিটার মর্টেনসেন

11

আমি জানি না আপনি পিএইচপি কাঠামো ব্যবহার করছেন কি না, তবে পিএইচপি ফ্রেমওয়ার্কের অনেকগুলি তারিখ / সময় গ্রন্থাগার এবং হুইলারের সাহায্যে আপনাকে চক্রটি পুনরায় উদ্ভাবন থেকে বিরত রাখতে সহায়তা করে।

উদাহরণস্বরূপ CodeIgniter এর timespan()ফাংশন রয়েছে। কেবল দুটি ইউনিক্স টাইমস্ট্যাম্প ইনপুট করুন এবং এটি স্বয়ংক্রিয়ভাবে এর ফলাফল তৈরি করবে:

1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes

http://codeigniter.com/user_guide/helpers/date_helper.html


8

উদাহরণ ব্যবহার করুন:

echo time_diff_string('2013-05-01 00:22:35', 'now');
echo time_diff_string('2013-05-01 00:22:35', 'now', true);

আউটপুট:

4 months ago
4 months, 2 weeks, 3 days, 1 hour, 49 minutes, 15 seconds ago

ফাংশন:

function time_diff_string($from, $to, $full = false) {
    $from = new DateTime($from);
    $to = new DateTime($to);
    $diff = $to->diff($from);

    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;

    $string = array(
        'y' => 'year',
        'm' => 'month',
        'w' => 'week',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    );
    foreach ($string as $k => &$v) {
        if ($diff->$k) {
            $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
        } else {
            unset($string[$k]);
        }
    }

    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' ago' : 'just now';
}

যদি আমি 30 মিনিটের পরে পার্থক্যটি বড় হয় তা নির্ধারণ করতে চাই তবে আমার কী করা উচিত?
অফির আতিয়া

@ ওফিরআটিয়া: আপনার মত প্রশ্নগুলির একগুচ্ছ প্রশ্ন রয়েছে এখানে, অনুসন্ধান অনুসন্ধান করুন। সাধারণ ডেমো
গ্লাভিć

7

এর জন্য আমার কিছু সাধারণ যুক্তি রয়েছে:

<?php
    per_days_diff('2011-12-12','2011-12-29')
    function per_days_diff($start_date, $end_date) {
        $per_days = 0;
        $noOfWeek = 0;
        $noOfWeekEnd = 0;
        $highSeason=array("7", "8");

        $current_date = strtotime($start_date);
        $current_date += (24 * 3600);
        $end_date = strtotime($end_date);

        $seassion = (in_array(date('m', $current_date), $highSeason))?"2":"1";

        $noOfdays = array('');

        while ($current_date <= $end_date) {
            if ($current_date <= $end_date) {
                $date = date('N', $current_date);
                array_push($noOfdays,$date);
                $current_date = strtotime('+1 day', $current_date);
            }
        }

        $finalDays = array_shift($noOfdays);
        //print_r($noOfdays);
        $weekFirst = array("week"=>array(),"weekEnd"=>array());
        for($i = 0; $i < count($noOfdays); $i++)
        {
            if ($noOfdays[$i] == 1)
            {
                //echo "This is week";
                //echo "<br/>";
                if($noOfdays[$i+6]==7)
                {
                    $noOfWeek++;
                    $i=$i+6;
                }
                else
                {
                    $per_days++;
                }
                //array_push($weekFirst["week"],$day);
            }
            else if($noOfdays[$i]==5)
            {
                //echo "This is weekend";
                //echo "<br/>";
                if($noOfdays[$i+2] ==7)
                {
                    $noOfWeekEnd++;
                    $i = $i+2;
                }
                else
                {
                    $per_days++;
                }
                //echo "After weekend value:- ".$i;
                //echo "<br/>";
            }
            else
            {
                $per_days++;
            }
        }

        /*echo $noOfWeek;
          echo "<br/>";
          echo $noOfWeekEnd;
          echo "<br/>";
          print_r($per_days);
          echo "<br/>";
          print_r($weekFirst);
        */

        $duration = array("weeks"=>$noOfWeek, "weekends"=>$noOfWeekEnd, "perDay"=>$per_days, "seassion"=>$seassion);
        return $duration;
      ?>

স্যাম্পল কোডের শেষে (একটি সমাপ্তি বন্ধনী এবং " ?> "?) রয়েছে এমন কিছু খুঁজে পাওয়া যাচ্ছে বলে মনে হচ্ছে ।
পিটার মর্টেনসেন

"সাধারণ" যুক্তি। এগুলি খাঁটি কোডের কমপক্ষে 40 টি লাইন।
ম্যাডজোজ

6

আপনি ব্যবহার করতে পারেন

getdate()

ফাংশন যা সরবরাহ করা তারিখ / সময়ের সমস্ত উপাদানযুক্ত একটি অ্যারে প্রদান করে:

$diff = abs($endDate - $startDate);
$my_t=getdate($diff);
print("$my_t[year] years, $my_t[month] months and $my_t[mday] days");

যদি আপনার শুরু এবং শেষের তারিখগুলি স্ট্রিং ফর্ম্যাটে থাকে তবে ব্যবহার করুন

$startDate = strtotime($startDateStr);
$endDate = strtotime($endDateStr);

উপরের কোড আগে


কাজ মনে হচ্ছে না। টাইমস্ট্যাম্প যুগের সূচনাতে আমি একটি তারিখ পাই।
স্যারবার

এটি বোঝা গুরুত্বপূর্ণ যে $my_t["year"] -= 1970বছরের সঠিক সংখ্যা পেতে আপনাকে একটি করা দরকার । ঘন্টা ঠিক করার জন্য আপনাকে GMT থেকে আপনার সময়ের পার্থক্য বিয়োগ করতে হবে। মাস এবং তারিখ থেকে আপনাকে 1 টি বিয়োগ করতে হবে।
সালমান এ

6
// If you just want to see the year difference then use this function.
// Using the logic I've created you may also create month and day difference
// which I did not provide here so you may have the efforts to use your brain.
// :)
$date1='2009-01-01';
$date2='2010-01-01';
echo getYearDifference ($date1,$date2);
function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){
    $year = 0;
    while($date2 > $date1 = strtotime('+1 year', $date1)){
        ++$year;
    }
    return $year;
}

"স্ট্রোটোটাইম ('+ 1 বছর', $ তারিখ 1)" লিপ বছরগুলিকে বিবেচনা করে?
পিটার মর্টেনসেন

6

এটি আমার কাজ। প্রয়োজনীয় পিএইচপি> = 5.3.4। এটি ডেটটাইম ক্লাস ব্যবহার করে। খুব দ্রুত, দ্রুত এবং দুটি তারিখ বা তথাকথিত "সময় থেকে" এর মধ্যে পার্থক্য করতে পারে।

if(function_exists('grk_Datetime_Since') === FALSE){
    function grk_Datetime_Since($From, $To='', $Prefix='', $Suffix=' ago', $Words=array()){
        #   Est-ce qu'on calcul jusqu'à un moment précis ? Probablement pas, on utilise maintenant
        if(empty($To) === TRUE){
            $To = time();
        }

        #   On va s'assurer que $From est numérique
        if(is_int($From) === FALSE){
            $From = strtotime($From);
        };

        #   On va s'assurer que $To est numérique
        if(is_int($To) === FALSE){
            $To = strtotime($To);
        }

        #   On a une erreur ?
        if($From === FALSE OR $From === -1 OR $To === FALSE OR $To === -1){
            return FALSE;
        }

        #   On va créer deux objets de date
        $From = new DateTime(@date('Y-m-d H:i:s', $From), new DateTimeZone('GMT'));
        $To   = new DateTime(@date('Y-m-d H:i:s', $To), new DateTimeZone('GMT'));

        #   On va calculer la différence entre $From et $To
        if(($Diff = $From->diff($To)) === FALSE){
            return FALSE;
        }

        #   On va merger le tableau des noms (par défaut, anglais)
        $Words = array_merge(array(
            'year'      => 'year',
            'years'     => 'years',
            'month'     => 'month',
            'months'    => 'months',
            'week'      => 'week',
            'weeks'     => 'weeks',
            'day'       => 'day',
            'days'      => 'days',
            'hour'      => 'hour',
            'hours'     => 'hours',
            'minute'    => 'minute',
            'minutes'   => 'minutes',
            'second'    => 'second',
            'seconds'   => 'seconds'
        ), $Words);

        #   On va créer la chaîne maintenant
        if($Diff->y > 1){
            $Text = $Diff->y.' '.$Words['years'];
        } elseif($Diff->y == 1){
            $Text = '1 '.$Words['year'];
        } elseif($Diff->m > 1){
            $Text = $Diff->m.' '.$Words['months'];
        } elseif($Diff->m == 1){
            $Text = '1 '.$Words['month'];
        } elseif($Diff->d > 7){
            $Text = ceil($Diff->d/7).' '.$Words['weeks'];
        } elseif($Diff->d == 7){
            $Text = '1 '.$Words['week'];
        } elseif($Diff->d > 1){
            $Text = $Diff->d.' '.$Words['days'];
        } elseif($Diff->d == 1){
            $Text = '1 '.$Words['day'];
        } elseif($Diff->h > 1){
            $Text = $Diff->h.' '.$Words['hours'];
        } elseif($Diff->h == 1){
            $Text = '1 '.$Words['hour'];
        } elseif($Diff->i > 1){
            $Text = $Diff->i.' '.$Words['minutes'];
        } elseif($Diff->i == 1){
            $Text = '1 '.$Words['minute'];
        } elseif($Diff->s > 1){
            $Text = $Diff->s.' '.$Words['seconds'];
        } else {
            $Text = '1 '.$Words['second'];
        }

        return $Prefix.$Text.$Suffix;
    }
}

6

আমি ব্যবহার date_createএবং date_diffজিনিস পছন্দ করতে চাই ।

কোড:

$date1 = date_create("2007-03-24");
$date2 = date_create("2009-06-26");

$dateDifference = date_diff($date1, $date2)->format('%y years, %m months and %d days');

echo $dateDifference;

আউটপুট:

2 years, 3 months and 2 days

আরও তথ্যের জন্য পিএইচপি date_diffম্যানুয়াল পড়ুন

ম্যানুয়াল অনুসারে ডেটটাইম :: ডিফ ()date_diff এর একটি নাম


5

এটি টাইমস্ট্যাম্প দেওয়া হয়েছিল কিনা তা সনাক্ত করার চেষ্টা করবে এবং ভবিষ্যতের তারিখগুলি / সময়গুলি নেতিবাচক মান হিসাবে ফিরে আসবে:

<?php

function time_diff($start, $end = NULL, $convert_to_timestamp = FALSE) {
  // If $convert_to_timestamp is not explicitly set to TRUE,
  // check to see if it was accidental:
  if ($convert_to_timestamp || !is_numeric($start)) {
    // If $convert_to_timestamp is TRUE, convert to timestamp:
    $timestamp_start = strtotime($start);
  }
  else {
    // Otherwise, leave it as a timestamp:
    $timestamp_start = $start;
  }
  // Same as above, but make sure $end has actually been overridden with a non-null,
  // non-empty, non-numeric value:
  if (!is_null($end) && (!empty($end) && !is_numeric($end))) {
    $timestamp_end = strtotime($end);
  }
  else {
    // If $end is NULL or empty and non-numeric value, assume the end time desired
    // is the current time (useful for age, etc):
    $timestamp_end = time();
  }
  // Regardless, set the start and end times to an integer:
  $start_time = (int) $timestamp_start;
  $end_time = (int) $timestamp_end;

  // Assign these values as the params for $then and $now:
  $start_time_var = 'start_time';
  $end_time_var = 'end_time';
  // Use this to determine if the output is positive (time passed) or negative (future):
  $pos_neg = 1;

  // If the end time is at a later time than the start time, do the opposite:
  if ($end_time <= $start_time) {
    $start_time_var = 'end_time';
    $end_time_var = 'start_time';
    $pos_neg = -1;
  }

  // Convert everything to the proper format, and do some math:
  $then = new DateTime(date('Y-m-d H:i:s', $$start_time_var));
  $now = new DateTime(date('Y-m-d H:i:s', $$end_time_var));

  $years_then = $then->format('Y');
  $years_now = $now->format('Y');
  $years = $years_now - $years_then;

  $months_then = $then->format('m');
  $months_now = $now->format('m');
  $months = $months_now - $months_then;

  $days_then = $then->format('d');
  $days_now = $now->format('d');
  $days = $days_now - $days_then;

  $hours_then = $then->format('H');
  $hours_now = $now->format('H');
  $hours = $hours_now - $hours_then;

  $minutes_then = $then->format('i');
  $minutes_now = $now->format('i');
  $minutes = $minutes_now - $minutes_then;

  $seconds_then = $then->format('s');
  $seconds_now = $now->format('s');
  $seconds = $seconds_now - $seconds_then;

  if ($seconds < 0) {
    $minutes -= 1;
    $seconds += 60;
  }
  if ($minutes < 0) {
    $hours -= 1;
    $minutes += 60;
  }
  if ($hours < 0) {
    $days -= 1;
    $hours += 24;
  }
  $months_last = $months_now - 1;
  if ($months_now == 1) {
    $years_now -= 1;
    $months_last = 12;
  }

  // "Thirty days hath September, April, June, and November" ;)
  if ($months_last == 9 || $months_last == 4 || $months_last == 6 || $months_last == 11) {
    $days_last_month = 30;
  }
  else if ($months_last == 2) {
    // Factor in leap years:
    if (($years_now % 4) == 0) {
      $days_last_month = 29;
    }
    else {
      $days_last_month = 28;
    }
  }
  else {
    $days_last_month = 31;
  }
  if ($days < 0) {
    $months -= 1;
    $days += $days_last_month;
  }
  if ($months < 0) {
    $years -= 1;
    $months += 12;
  }

  // Finally, multiply each value by either 1 (in which case it will stay the same),
  // or by -1 (in which case it will become negative, for future dates).
  // Note: 0 * 1 == 0 * -1 == 0
  $out = new stdClass;
  $out->years = (int) $years * $pos_neg;
  $out->months = (int) $months * $pos_neg;
  $out->days = (int) $days * $pos_neg;
  $out->hours = (int) $hours * $pos_neg;
  $out->minutes = (int) $minutes * $pos_neg;
  $out->seconds = (int) $seconds * $pos_neg;
  return $out;
}

ব্যবহারের উদাহরণ:

<?php
  $birthday = 'June 2, 1971';
  $check_age_for_this_date = 'June 3, 1999 8:53pm';
  $age = time_diff($birthday, $check_age_for_this_date)->years;
  print $age;// 28

বা:

<?php
  $christmas_2020 = 'December 25, 2020';
  $countdown = time_diff($christmas_2020);
  print_r($countdown);

5

"যদি" তারিখটি মাইএসকিউএলতে সঞ্চিত থাকে, তবে আমি ডাটাবেস স্তরে পার্থক্য গণনা করা আরও সহজ মনে করি ... তারপরে দিবস, আওয়ার, মিনিট, সেক আউটপুট, পার্স এবং ডিসপ্লে ফলাফলের উপর ভিত্তি করে যথাযথ ...

mysql> select firstName, convert_tz(loginDate, '+00:00', '-04:00') as loginDate, TIMESTAMPDIFF(DAY, loginDate, now()) as 'Day', TIMESTAMPDIFF(HOUR, loginDate, now())+4 as 'Hour', TIMESTAMPDIFF(MINUTE, loginDate, now())+(60*4) as 'Min', TIMESTAMPDIFF(SECOND, loginDate, now())+(60*60*4) as 'Sec' from User_ where userId != '10158' AND userId != '10198' group by emailAddress order by loginDate desc;
 +-----------+---------------------+------+------+------+--------+
 | firstName | loginDate           | Day  | Hour | Min  | Sec    |
 +-----------+---------------------+------+------+------+--------+
 | Peter     | 2014-03-30 18:54:40 |    0 |    4 |  244 |  14644 |
 | Keith     | 2014-03-30 18:54:11 |    0 |    4 |  244 |  14673 |
 | Andres    | 2014-03-28 09:20:10 |    2 |   61 | 3698 | 221914 |
 | Nadeem    | 2014-03-26 09:33:43 |    4 |  109 | 6565 | 393901 |
 +-----------+---------------------+------+------+------+--------+
 4 rows in set (0.00 sec)

5

আমি নীচের পৃষ্ঠায় আপনার নিবন্ধটি পেয়েছি, যা পিএইচপি তারিখের সময় গণনার জন্য অনেকগুলি উল্লেখ রয়েছে ।

পিএইচপি ব্যবহার করে দুটি তারিখের (এবং সময়) মধ্যে পার্থক্য গণনা করুন। নিম্নলিখিত পৃষ্ঠায় পিএইচপি ব্যবহার করে তারিখ / সময় গণনা সম্পাদনের জন্য সময় (ঘন্টা, মুনাইট), দিন, মাস বা দুই তারিখের মধ্যে বছরের পার্থক্য নির্ধারণের জন্য বিভিন্ন পদ্ধতি (মোট 7 টি) সরবরাহ করে।

পিএইচপি তারিখের সময় - 2 তারিখের মধ্যে পার্থক্য গণনা করার জন্য 7 টি পদ্ধতি দেখুন ।


4

আপনি $ তারিখ 1 = ued তারিখের চেয়ে বেশি রাউন্ড ভগ্নাংশ দ্বারা তারিখের পার্থক্য ফেরত দিতে নিম্নলিখিত কোডগুলি ব্যবহার করতে পারেন; // নির্ধারিত তারিখ প্রতিধ্বনি $ তারিখ 2 = তারিখ ("ওয়াইএমডি"); // বর্তমান তারিখ s ts1 = স্ট্রোটোটাইম ($ তারিখ 1); s ts2 = স্ট্রোটোটাইম ($ তারিখ 2); $ সেকেন্ড_ডিফ = $ টিএস 1 - $ টিএস 2; প্রতিধ্বনি $ ডেটেডিফ = সিল (($ সেকেন্ড_ডিফ / 3600) / 24); // দিন ফিরে

আপনি সিলের পরিবর্তে পিএইচপি এর মেঝে পদ্ধতি ব্যবহার করলে এটি আপনাকে গোলাকার ভগ্নাংশটি নীচে ফিরিয়ে আনবে। দয়া করে এখানে পার্থক্যটি পরীক্ষা করুন, কিছু সময় যদি আপনার স্টেজিং সার্ভারের সময় অঞ্চল আলাদা হয় তবে লাইভ সাইটের সময় অঞ্চল সেই ক্ষেত্রে আপনি বিভিন্ন ফলাফল পেতে পারেন তাই শর্ত অনুসারে পরিবর্তন করুন।


4
$date1 = date_create('2007-03-24');
$date2 = date_create('2009-06-26');
$interval = date_diff($date1, $date2);
echo "difference : " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days ";

4

আপনি সর্বদা নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন যা বছর এবং মাসগুলিতে বয়স ফিরিয়ে দিতে পারে (যেমন 1 বছর 4 মাস)

function getAge($dob, $age_at_date)
{  
    $d1 = new DateTime($dob);
    $d2 = new DateTime($age_at_date);
    $age = $d2->diff($d1);
    $years = $age->y;
    $months = $age->m;

    return $years.'.'.months;
}

বা আপনি যদি বর্তমান তারিখে বয়স গণনা করতে চান তবে আপনি এটি ব্যবহার করতে পারেন

function getAge($dob)
{  
    $d1 = new DateTime($dob);
    $d2 = new DateTime(date());
    $age = $d2->diff($d1);
    $years = $age->y;
    $months = $age->m;

    return $years.'.'.months;
}

4

পিএইচপি সংস্করণ> = 5.3 এর জন্য: দুটি তারিখ অবজেক্ট তৈরি করুন এবং তারপরে date_diff()ফাংশনটি ব্যবহার করুন। এটি পিএইচপি ডেটইন্টারওয়াল অবজেক্টটি ফিরিয়ে দেবে । ডকুমেন্টেশন দেখুন

$date1=date_create("2007-03-24");
$date2=date_create("2009-06-26");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");

4

এখানে চলমান কোড

$date1 = date_create('2007-03-24');
$date2 = date_create('2009-06-26');
$diff1 = date_diff($date1,$date2);
$daysdiff = $diff1->format("%R%a");
$daysdiff = abs($daysdiff);

3

আমার পিএইচপি 5.2 এর একই সমস্যা ছিল এবং এটি মাইএসকিউএল দিয়ে সমাধান করেছে। আপনি যা খুঁজছেন ঠিক তেমনটি নাও হতে পারে তবে এটি কৌশলটি করবে এবং দিনের সংখ্যা ফিরিয়ে দেবে:

$datediff_q = $dbh->prepare("SELECT DATEDIFF(:date2, :date1)");
$datediff_q->bindValue(':date1', '2007-03-24', PDO::PARAM_STR);
$datediff_q->bindValue(':date2', '2009-06-26', PDO::PARAM_STR);
$datediff = ($datediff_q->execute()) ? $datediff_q->fetchColumn(0) : false;

এখানে আরো তথ্য http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff


3

যেহেতু প্রত্যেকে কোডের নমুনাগুলি পোস্ট করছে, তাই এখানে অন্য সংস্করণ।

আমি সেকেন্ড থেকে বছরের মধ্যে পার্থক্য প্রদর্শন করার জন্য একটি ফাংশন চেয়েছিলাম (মাত্র একটি ইউনিট)। 1 দিনেরও বেশি সময়ের জন্য, আমি এটি মধ্যরাতে রোলওভার করতে চেয়েছিলাম (বুধবার সকাল 9 টা থেকে বুধবার সকাল 10 টা দেখা গেছে 2 দিন আগে, 1 নয়)। এবং এক মাস ধরে পিরিয়ডের জন্য, আমি চেয়েছিলাম যে রোলওভারটি মাসের একই দিনে (30/31 দিনের মাস এবং লিপ বছর সহ) অন্তর্ভুক্ত থাকে।

এটিই আমি নিয়ে এসেছি:

/**
 * Returns how long ago something happened in the past, showing it
 * as n seconds / minutes / hours / days / weeks / months / years ago.
 *
 * For periods over a day, it rolls over at midnight (so doesn't depend
 * on current time of day), and it correctly accounts for month-lengths
 * and leap-years (months and years rollover on current day of month).
 *
 * $param string $timestamp in DateTime format
 * $return string description of interval
 */
function ago($timestamp)
{
    $then = date_create($timestamp);

    // for anything over 1 day, make it rollover on midnight
    $today = date_create('tomorrow'); // ie end of today
    $diff = date_diff($then, $today);

    if ($diff->y > 0) return $diff->y.' year'.($diff->y>1?'s':'').' ago';
    if ($diff->m > 0) return $diff->m.' month'.($diff->m>1?'s':'').' ago';
    $diffW = floor($diff->d / 7);
    if ($diffW > 0) return $diffW.' week'.($diffW>1?'s':'').' ago';
    if ($diff->d > 1) return $diff->d.' day'.($diff->d>1?'s':'').' ago';

    // for anything less than 1 day, base it off 'now'
    $now = date_create();
    $diff = date_diff($then, $now);

    if ($diff->d > 0) return 'yesterday';
    if ($diff->h > 0) return $diff->h.' hour'.($diff->h>1?'s':'').' ago';
    if ($diff->i > 0) return $diff->i.' minute'.($diff->i>1?'s':'').' ago';
    return $diff->s.' second'.($diff->s==1?'':'s').' ago';
}

3

কিছু সময় আগে আমি একটি format_dateফাংশন লিখেছিলাম কারণ এটি আপনাকে কীভাবে আপনার তারিখটি চায় তার অনেকগুলি বিকল্প দেয় :

function format_date($date, $type, $seperator="-")
{
    if($date)
    {
        $day = date("j", strtotime($date));
        $month = date("n", strtotime($date));
        $year = date("Y", strtotime($date));
        $hour = date("H", strtotime($date));
        $min = date("i", strtotime($date));
        $sec = date("s", strtotime($date));

        switch($type)
        {
            case 0:  $date = date("Y".$seperator."m".$seperator."d",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 1:  $date = date("D, F j, Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 2:  $date = date("d".$seperator."m".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 3:  $date = date("d".$seperator."M".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 4:  $date = date("d".$seperator."M".$seperator."Y h:i A",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 5:  $date = date("m".$seperator."d".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 6:  $date = date("M",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 7:  $date = date("Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 8:  $date = date("j",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 9:  $date = date("n",mktime($hour, $min, $sec, $month, $day, $year)); break;
            case 10: 
                     $diff = abs(strtotime($date) - strtotime(date("Y-m-d h:i:s"))); 
                     $years = floor($diff / (365*60*60*24));
                     $months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
                     $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
                     $date = $years . " years, " . $months . " months, " . $days . "days";
        }
    }
    return($date);
}    

2
এই উত্তরটি খালদোনোর জবাবের মতোই ভুল। এটি ধরে নিয়েছে (কেস 10) যে কোনও বছরে 365 দিন থাকে (প্রতি চতুর্থ বছরে 366 দিন থাকে (গ্রেগরিয়ান ক্যালেন্ডারের জন্য 100 বছর / 400 বছরের নিয়ম ব্যতীত)) এবং এক মাসে 30 দিন থাকে (এটি প্রায় 30.42 দিন হয়) নন-লিপ বছরগুলিতে)। এমনকি ভাল ধ্রুবকগুলির সাথে এটি কেবলমাত্র গড়ে সঠিক, কোনও দুটি নির্দিষ্ট তারিখের জন্য অগত্যা সঠিক নয়।
পিটার মর্টেনসেন

3

খুব সহজ:

    <?php
        $date1 = date_create("2007-03-24");
        echo "Start date: ".$date1->format("Y-m-d")."<br>";
        $date2 = date_create("2009-06-26");
        echo "End date: ".$date2->format("Y-m-d")."<br>";
        $diff = date_diff($date1,$date2);
        echo "Difference between start date and end date: ".$diff->format("%y years, %m months and %d days")."<br>";
    ?>

বিস্তারিত জানার জন্য নীচের লিঙ্কটি চেকআউট করুন:

পিএইচপি: তারিখ_ডিফ - ম্যানুয়াল

মনে রাখবেন এটি পিএইচপি 5.3.0 বা তারও বেশি এর জন্য।


3

একটি সহজ ফাংশন

function time_difference($time_1, $time_2, $limit = null)
{

    $val_1 = new DateTime($time_1);
    $val_2 = new DateTime($time_2);

    $interval = $val_1->diff($val_2);

    $output = array(
        "year" => $interval->y,
        "month" => $interval->m,
        "day" => $interval->d,
        "hour" => $interval->h,
        "minute" => $interval->i,
        "second" => $interval->s
    );

    $return = "";
    foreach ($output AS $key => $value) {

        if ($value == 1)
            $return .= $value . " " . $key . " ";
        elseif ($value >= 1)
            $return .= $value . " " . $key . "s ";

        if ($key == $limit)
            return trim($return);
    }
    return trim($return);
}

মত ব্যবহার করুন

echo time_difference ($time_1, $time_2, "day");

মত ফিরে আসবে 2 years 8 months 2 days


3

ডেট_ডিফ () ব্যবহার করে খুব সাধারণ উত্তরটি ব্যবহার করে দেখুন , এটি পরীক্ষা করা হয়েছে।

$date1 = date_create("2017-11-27");
$date2 = date_create("2018-12-29");
$diff=date_diff($date1,$date2);
$months = $diff->format("%m months");
$years = $diff->format("%y years");
$days = $diff->format("%d days");

echo $years .' '.$months.' '.$days;

আউটপুটটি হ'ল:

1 years 1 months 2 days

2

আমি নিম্নলিখিত ফাংশনটি ব্যবহার করছি যা আমি লিখেছিলাম, যখন পিএইচপি 5.3 (যথাক্রমে ডেট_ডিফ ()) পাওয়া যায় না:

        function dateDifference($startDate, $endDate)
        {
            $startDate = strtotime($startDate);
            $endDate = strtotime($endDate);
            if ($startDate === false || $startDate < 0 || $endDate === false || $endDate < 0 || $startDate > $endDate)
                return false;

            $years = date('Y', $endDate) - date('Y', $startDate);

            $endMonth = date('m', $endDate);
            $startMonth = date('m', $startDate);

            // Calculate months
            $months = $endMonth - $startMonth;
            if ($months <= 0)  {
                $months += 12;
                $years--;
            }
            if ($years < 0)
                return false;

            // Calculate the days
            $measure = ($months == 1) ? 'month' : 'months';
            $days = $endDate - strtotime('+' . $months . ' ' . $measure, $startDate);
            $days = date('z', $days);   

            return array($years, $months, $days);
        }

2

DateInterval দুর্দান্ত তবে এটিতে বেশ কয়েকটা সতর্কতা রয়েছে:

  1. কেবল পিএইচপি 5.3+ এর জন্য ( তবে এটি আর ভাল অজুহাত নয় )
  2. শুধুমাত্র বছর, মাস, দিন, ঘন্টা, মিনিট এবং সেকেন্ড সমর্থন করে (কোনও সপ্তাহ নেই)
  3. এটি উপরের সমস্ত + দিনের সাথে পার্থক্য গণনা করে (আপনি কেবল কয়েক মাসের মধ্যে পার্থক্য পেতে পারবেন না)

এ থেকে উত্তরণের জন্য, আমি নিম্নলিখিতগুলি কোড করেছিলাম ( @ এনবোরেভ উত্তর থেকে উন্নত ):

function date_dif($since, $until, $keys = 'year|month|week|day|hour|minute|second')
{
    $date = array_map('strtotime', array($since, $until));

    if ((count($date = array_filter($date, 'is_int')) == 2) && (sort($date) === true))
    {
        $result = array_fill_keys(explode('|', $keys), 0);

        foreach (preg_grep('~^(?:year|month)~i', $result) as $key => $value)
        {
            while ($date[1] >= strtotime(sprintf('+%u %s', $value + 1, $key), $date[0]))
            {
                ++$value;
            }

            $date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]);
        }

        foreach (preg_grep('~^(?:year|month)~i', $result, PREG_GREP_INVERT) as $key => $value)
        {
            if (($value = intval(abs($date[0] - $date[1]) / strtotime(sprintf('%u %s', 1, $key), 0))) > 0)
            {
                $date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]);
            }
        }

        return $result;
    }

    return false;
}

এটি দুটি লুপ চালায়; প্রথমটি ব্রুট-ফোর্সিংয়ের মাধ্যমে আপেক্ষিক বিরতির (বছর এবং মাস) এর সাথে আলোচনা করে এবং দ্বিতীয়টি অতিরিক্ত গাণিতিক ব্যবধানগুলি সাধারণ গাণিতিকের সাথে গণনা করে (সুতরাং এটি দ্রুত):

echo humanize(date_dif('2007-03-24', '2009-07-31', 'second')); // 74300400 seconds
echo humanize(date_dif('2007-03-24', '2009-07-31', 'minute|second')); // 1238400 minutes, 0 seconds
echo humanize(date_dif('2007-03-24', '2009-07-31', 'hour|minute|second')); // 20640 hours, 0 minutes, 0 seconds
echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|day')); // 2 years, 129 days
echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week')); // 2 years, 18 weeks
echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week|day')); // 2 years, 18 weeks, 3 days
echo humanize(date_dif('2007-03-24', '2009-07-31')); // 2 years, 4 months, 1 week, 0 days, 0 hours, 0 minutes, 0 seconds

function humanize($array)
{
    $result = array();

    foreach ($array as $key => $value)
    {
        $result[$key] = $value . ' ' . $key;

        if ($value != 1)
        {
            $result[$key] .= 's';
        }
    }

    return implode(', ', $result);
}

@ পিটারমোরটেনসেন: এটি কাজ করা উচিত, তবে আমি কোনও গ্যারান্টি দিচ্ছি না। আপনার সময় অঞ্চল সেট করুন এবং এটিকে একবার দেখুন।
অ্যালিক্স অ্যাক্সেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.