दो तिथियों के बीच दिनों की संख्या का पता लगाना


615

PHP का उपयोग करके दो तिथियों के बीच दिनों की संख्या कैसे पता करें?



5
एक लाइनर:(new DateTime("2010-01-11"))->diff(new DateTime("2019-08-19"))->days;
billynoah

@ बिलीनोहा - यह सबसे साफ और अधिक सरल उत्तर है!
11

जवाबों:


906
$now = time(); // or your date as well
$your_date = strtotime("2010-01-31");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));

38
मुझे लगता है कि नकारात्मक दिनों की वापसी से प्रासंगिक जानकारी मिलती है। और $your_date-$nowयदि आप एक सकारात्मक पूर्णांक वापस करने के लिए भविष्य की तारीख चाहते हैं, तो आपको उपयोग करना चाहिए ।
टिम

23
लीप सेकंड के बारे में क्या? सभी दिनों में बिल्कुल 24 * 60 * 60 सेकंड नहीं होते हैं। यह कोड व्यावहारिक उद्देश्यों के लिए पर्याप्त हो सकता है लेकिन यह अत्यंत दुर्लभ धार मामलों में सटीक नहीं है।
बेंजामिन ब्रेज़ी

49
लीप सेकंड को भूल जाओ (नहीं, वास्तव में उन पर भी विचार करें) लेकिन यह डेलाइट सेविंग टाइम परिवर्तनों के लिए जिम्मेदार नहीं है! यह हर साल उन सीमाओं पर एक पूरे दिन तक बंद हो सकता है। आपको DateTime कक्षाओं का उपयोग करने की आवश्यकता है।
लेवी

6
@billynoah क्षमा करें, मैं अपनी टिप्पणी को अपडेट करने के लिए कभी वापस नहीं आया। आपको डेलाइट सेविंग टाइम ज़ोन से सावधान रहना होगा। यदि आप दिन के उजाले की बचत के साथ किसी तिथि की तुलना करते हैं, तो इसके बिना एक तारीख फिर से शुरू हो जाती है, उदाहरण के लिए 7 दिन वापस आने के बाद यह 6.9 दिन हो जाती है। मंजिल लेना 7. के बजाय 6 लौटाता है
एलेक्स एंजेलिको

4
न केवल स्ट्रेटोटाइम () 20 वर्षों में विफल हो जाता है, यह अभी अनुपयोगी है। ओपी ने तिथि निर्दिष्ट की, समय नहीं। तिथियां काफी पुरानी हो सकती हैं। यहाँ एक सरल उत्तर है: $ NumberDays = gregoriantojd ($ EndM, $ EndD, $ EndY) - gregoriantojd ($ StartM, $ StartD, $ StartY); (एक समावेशी रेंज के लिए)। डेटाइम क्लास के विपरीत, ग्रेगोरियन से जूलियन v4 अप में उपलब्ध है। मान्य रेंज 4714 ईसा पूर्व से 9999 ईस्वी तक कायरता पैरामीटर ऑर्डर से सावधान रहें (जैसे आपको php के लिए उस चेतावनी की आवश्यकता है)।
गाइ गॉर्डन

522

यदि आप उपयोग कर रहे हैं PHP 5.3 >, तो यह अंतर की गणना करने का सबसे सटीक तरीका है:

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$diff = $later->diff($earlier)->format("%a");

14
ध्यान दें कि क्योंकि हम समय अंतराल के बारे में बात कर रहे हैं समय में विशिष्ट बिंदु नहीं, प्रारूप वाक्यविन्यास दिनांक () और स्ट्रैफ़टाइम () सिंटैक्स से अलग है। समय अंतराल सिंटैक्स यहाँ पाया जा सकता है: php.net/manual/en/dateinterval.format.php
एंड्रयू

1
या मेरे मामले में दोनों के बीच दिनों की संख्या $ 2 है-> अंतर ($ तारीख 1) -> प्रारूप ("% a") - 1
xio

13
ध्यान रखें कि यदि आपके पास अपनी तारीखों में समय है, तो यह काम नहीं करेगा जैसा कि आप उम्मीद कर सकते हैं। उदाहरण के लिए, यदि आपके पास 23:30 घंटे का अंतराल है ... और वे अलग-अलग दिनों में हैं, तो अंतर 0. होगा
14'14

19
यदि आपको दिनों की एक सापेक्ष संख्या ( $date1पूर्वकाल के समय नकारात्मक $date2) की आवश्यकता है, तो $diff = $date2->diff($date1)->format("%r%a");इसके बजाय उपयोग करें ।
सोसाइटी

1
दिनांक का प्रारूप क्या है ?, क्या DateTime("2010-07-06")यह Y-m-dया Y-d-m?, DateTimeपैरामीटर का प्रारूप क्या है । कौन सा दिन है?
151291

165

PHP संस्करण 5.3 और ऊपर से, अंतर प्राप्त करने के लिए नई तिथि / समय फ़ंक्शन जोड़े गए हैं:

$datetime1 = new DateTime("2010-06-20");

$datetime2 = new DateTime("2011-06-22");

$difference = $datetime1->diff($datetime2);

echo 'Difference: '.$difference->y.' years, ' 
                   .$difference->m.' months, ' 
                   .$difference->d.' days';

print_r($difference);

नीचे के रूप में परिणाम:

Difference: 1 years, 0 months, 2 days

DateInterval Object
(
    [y] => 1
    [m] => 0
    [d] => 2
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 367
)

आशा है ये मदद करेगा !


8
हां, यह स्वीकृत उत्तर से बेहतर लगता है, जो कुछ मामलों में काम नहीं करता है। जैसे: $ से = '2014-03-01'; = '2014-03-31' करने के लिए $;
एमबीज़िक

1
मैं सहमत हूं, इसलिए अनुसरण करना आसान है और महान काम करता है !!! बस date_default_timezone_set () फ़ंक्शन का उपयोग करना न भूलें या यह आपको यूटीसी समय के आधार पर अजीब परिणाम देगा।
zeckdude

2
यह फ़ंक्शन 1980 और 2020 के बीच
14603

128

अपनी तारीखों को यूनिक्स टाइमस्टैम्प में परिवर्तित करें, फिर एक को दूसरे से अलग करें। यह आपको सेकंड में अंतर देगा, जिसे आप 86400 (एक दिन में सेकंड की राशि) से विभाजित करते हैं, जिससे आपको उस सीमा में लगभग एक दिन की राशि मिलती है।

यदि आपकी तारीखें प्रारूप में हैं 25.1.2010, 01/25/2010या 2010-01-25, आप strtotimeफ़ंक्शन का उपयोग कर सकते हैं :

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);

ceilअगले पूर्ण दिन तक दिनों की मात्रा का उपयोग करना । floorइसके बजाय यदि आप उन दो तिथियों के बीच पूरे दिनों की राशि प्राप्त करना चाहते हैं तो उपयोग करें ।

यदि आपकी तिथियां पहले से ही यूनिक्स टाइमस्टैम्प प्रारूप में हैं, तो आप कनवर्ट करना छोड़ सकते हैं और केवल $days_betweenभाग कर सकते हैं। अधिक विदेशी दिनांक स्वरूपों के लिए, आपको इसे सही करने के लिए कुछ कस्टम पार्सिंग करनी पड़ सकती है।


9
DST के बारे में क्या?
तून81

3
@ toon81 - इस तरह की गंदगी से बचने के लिए हम यूनिक्स टाइमस्टैम्प का उपयोग करते हैं ! ;)
एलस्टेयर

6
मुझे विस्तार से बताएं: बताते हैं कि आज सुबह 3 बजे, लगभग पूरे यूरोप ने घड़ी को एक घंटे पीछे कर दिया। इसका मतलब है कि आज एक अतिरिक्त 3600 सेकंड है, और यह UNIX टाइमस्टैम्प में परिलक्षित होना चाहिए। यदि यह है, तो इसका मतलब है कि आज दो दिनों की गणना उपरोक्त दिनों की गणना के तरीके के साथ होगी। और मैं भी लीप सेकंड के बारे में शुरू नहीं कर रहा हूं क्योंकि न तो PHP और न ही UNIX उन लोगों के लिए खाता है (जो IMO वास्तव में समझ में आता है)। TL; DR: सभी दिन 86,400 सेकंड लंबे नहीं होते हैं
तून81

2
@ toon81 उस तिथि के लिए 3600 अधिक सेकंड नहीं हैं। DST से या उसके पास जाने पर UNIX टाइमस्टैम्प पर कुछ भी नहीं होता है।
निकडंक

1
यदि UNIX टाइमस्टैम्प में कुछ भी नहीं होता है, तो आप मेरे साथ सहमत हैं: UNIX टाइमस्टैम्प पर 1PM पर $dayऔर UNIX टाइमस्टैम्प पर 1PM पर अंतर $day+1हमेशा 86400 सेकंड में नहीं होता है, जो टाइमस्टोन में जीएसटी का निरीक्षण करते हैं। यह 24 घंटे के बजाए 23 या 25 घंटे का समय हो सकता है।
toon81

111

TL, DR UNIX टाइमस्टैम्प का उपयोग नहीं करता है । उपयोग न करेंtime() । यदि आप करते हैं, तो तैयार रहें इसकी 98.0825% विश्वसनीयता आपको विफल करनी चाहिए। डेटटाइम (या कार्बन) का उपयोग करें।

सही जवाब Saksham गुप्ता (अन्य उत्तर भी सही हैं) द्वारा दिए गए एक है:

$date1 = new DateTime('2010-07-06');
$date2 = new DateTime('2010-07-09');
$days  = $date2->diff($date1)->format('%a');

या एक-लाइनर के रूप में प्रक्रियात्मक रूप से:

/**
 * Number of days between two dates.
 *
 * @param date $dt1    First date
 * @param date $dt2    Second date
 * @return int
 */
function daysBetween($dt1, $dt2) {
    return date_diff(
        date_create($dt2),  
        date_create($dt1)
    )->format('%a');
}

एक चेतावनी के साथ: '% a' दिनों की निरपेक्ष संख्या को इंगित करता है । यदि आप इसे एक हस्ताक्षरित पूर्णांक के रूप में चाहते हैं, अर्थात जब दूसरी तारीख पहली से पहले होती है, तो आपको '% r' उपसर्ग (यानी format('%r%a')) का उपयोग करने की आवश्यकता होती है ।


यदि आप वास्तव में UNIX टाइमस्टैम्प का उपयोग करते हैं, तो नीचे दिए गए अधिकांश नुकसानों से बचने के लिए GMT का समय क्षेत्र निर्धारित करें।


लंबे उत्तर: क्यों 24 * 60 * 60 (उर्फ 86400) से विभाजित करना असुरक्षित है

UNIX टाइमस्टैम्प (और दिनों में बदलने के लिए 86400) का उपयोग करते हुए अधिकांश उत्तर दो धारणाएं बनाते हैं, जो एक साथ डालते हैं, गलत परिणाम और सूक्ष्म बग के साथ परिदृश्यों को जन्म दे सकते हैं जो ट्रैक करना मुश्किल हो सकता है, और यहां तक ​​कि दिन, सप्ताह या महीनों में उत्पन्न हो सकते हैं। एक सफल तैनाती। ऐसा नहीं है कि समाधान काम नहीं करता है - यह काम करता है। आज। लेकिन यह कल काम करना बंद कर सकता है।

पहली गलती यह विचार नहीं कर रही है कि जब पूछा गया, "कल से कितने दिन बीत गए?", एक कंप्यूटर सच्चाई का जवाब दे सकता है यदि वर्तमान और तत्काल के बीच "कल" ​​द्वारा संकेत दिया गया एक दिन से कम हो गया है।

आमतौर पर जब एक "दिन" को UNIX टाइमस्टैम्प में परिवर्तित किया जाता है, तो जो प्राप्त होता है, उस विशेष दिन की मध्यरात्रि के लिए टाइमस्टैम्प होता है।

इसलिए 1 अक्टूबर से 15 अक्टूबर के मध्य के बीच, पंद्रह दिन बीत चुके हैं। 1 अक्टूबर के 13:00 और 15 अक्टूबर के 14:55 के बीच, पंद्रह दिनों के माइनस 5 मिनट बीत चुके हैं, और floor()अंतर्निहित पूर्णांक रूपांतरण का उपयोग या करने वाले अधिकांश समाधान एक दिन कम की अपेक्षा करेंगे

तो, "कितने दिन पहले Ymd H: i: s" था? निकलेगा गलत जवाब

दूसरी गलती एक दिन 86400 सेकंड के बराबर है। यह लगभग हमेशा सच होता है - अक्सर ऐसा होता है कि यह उस समय की अनदेखी नहीं करता है। लेकिन लगातार दो मिडनाइट्स के बीच सेकंड में दूरी निश्चित रूप से वर्ष में कम से कम दो बार 86400 नहीं होती है जब दिन के समय की बचत का समय खेल में आता है। एक डीएसटी सीमा के पार दो तारीखों की तुलना करने से गलत उत्तर मिलेगा।

इसलिए, भले ही आप एक निश्चित समय के लिए सभी डेट टाइमस्टैम्प्स को मजबूर करने के "हैक" का उपयोग करते हैं, मध्यरात्रि कहें (यह भी विभिन्न भाषाओं और रूपरेखाओं द्वारा किया जाता है जब आप केवल दिन-महीने-वर्ष निर्दिष्ट करते हैं और घंटे-मिनट-सेकंड भी नहीं; डेटाबेस (जैसे MySQL) में DATE प्रकार के साथ ही हैप्पीनेस, व्यापक रूप से उपयोग किया जाने वाला सूत्र

 (unix_timestamp(DATE2) - unix_timestamp(DATE1)) / 86400

या

 floor(time() - strtotime($somedate)) / 86400

वर्ष के समान DST सेगमेंट में DATE1 और DATE2 के होने पर 17, वापस लौटेंगे; लेकिन यह 17.042, और बदतर अभी भी, 16.958 वापस आ सकता है। फर्श का उपयोग () या पूर्णांक के लिए किसी भी निहित ट्रंकेशन को तब परिवर्तित किया जाएगा जो 17 से 16 तक होना चाहिए था। अन्य परिस्थितियों में, "$ दिन> 17" जैसे भाव true17.042 के लिए वापस आ जाएंगे, भले ही यह इंगित करता हो कि बीता हुआ दिन गिनती 18 है।

और ऐसी चीजें और भी बदसूरत हो जाती हैं क्योंकि इस तरह के कोड प्लेटफार्मों में पोर्टेबल नहीं होते हैं , क्योंकि उनमें से कुछ लीप सेकंड लागू कर सकते हैं और कुछ नहीं हो सकते हैं । उन प्लेटफार्मों पर जो करते हैं , दो तिथियों के बीच का अंतर 86400 नहीं बल्कि 86401, या शायद 86399 होगा। इसलिए कोड जो मई में काम किया और वास्तव में सभी परीक्षण अगले जून में टूटेंगे जब 12.99999 दिनों को 13. दो तिथियों के बजाय 12 दिन माना जाएगा। 2015 में काम किया है कि 2017 में काम नहीं करेगा - एक ही तारीख, और न ही वर्ष एक लीप वर्ष है। लेकिन 2018-03-01 और 2017-03-01 के बीच, उन प्लेटफार्मों पर जो देखभाल करते हैं, 365 के बजाय 366 दिन बीत चुके होंगे, 2018 को एक लीप वर्ष (जो यह नहीं है) बना देगा।

तो अगर आप वास्तव में UNIX टाइमस्टैम्प का उपयोग करना चाहते हैं:

  • round()फ़ंक्शन का उपयोग समझदारी से करें, नहीं floor()

  • एक विकल्प के रूप में, D1-M1-YYY1 और D2-M2-YYY2 के बीच अंतर की गणना न करें। उन तिथियों को वास्तव में D1-M1-YYY1 00:00:00 और D2-M2-YYY2 00:00:00 माना जाएगा। बल्कि, D1-M1-YYY1 22:30:00 और D2-M2-YYY2 04:30:00 के बीच कनवर्ट करें। आपको हमेशा लगभग बीस घंटे का समय मिलेगा। यह इक्कीस घंटे या उन्नीस हो सकता है, और शायद अठारह घंटे, उनतीस मिनट छत्तीस सेकंड। कोई बात नहीं। यह एक बड़ा मार्जिन है जो भविष्य के लिए भविष्य के लिए वहाँ रहेगा और सकारात्मक रहेगा। अब आप इसे floor()सुरक्षा में छोटा कर सकते हैं ।

जादू कांस्टेंट से बचने के लिए, गोल कीचड़ और एक रखरखाव ऋण से बचने का सही समाधान है

  • एक समय पुस्तकालय (डेटाइम, कार्बन, जो भी हो) का उपयोग करें; अपना रोल मत करो

  • डीएसटी सीमाओं के पार, लीप वर्षों में, लीप सेकंड में, और इसी तरह, साथ ही साथ सामान्य तिथियों में - वास्तव में बुरी तारीख विकल्पों का उपयोग करके व्यापक परीक्षण के मामले लिखें । आदर्श रूप से (डेटाइम के लिए कॉल तेज़ हैं !) चार पूरे साल की (और एक दिन की) तारीखों को तार से, क्रमिक रूप से जोड़कर उत्पन्न करते हैं , और सुनिश्चित करते हैं कि पहले दिन और परीक्षण किए जा रहे दिन के बीच का अंतर एक-एक करके लगातार बढ़ता जाता है। यह सुनिश्चित करेगा कि यदि निम्न-स्तरीय दिनचर्या और लीप सेकंड फिक्स में कुछ भी परिवर्तन कहर बरपाए, तो कम से कम आपको पता चल जाएगा ।

  • उन परीक्षणों को नियमित रूप से बाकी परीक्षण सूट के साथ चलाएं। वे मिलीसेकंड की बात कर रहे हैं, और आप सचमुच सिर खुजलाने के घंटे बचा सकते हैं ।


जो भी आपके समाधान, यह परीक्षण!

funcdiffनीचे दिए गए फ़ंक्शन किसी एक समाधान को लागू करता है (जैसा कि ऐसा होता है, स्वीकृत एक) वास्तविक दुनिया के परिदृश्य में।

<?php
$tz         = 'Europe/Rome';
$yearFrom   = 1980;
$yearTo     = 2020;
$verbose    = false;

function funcdiff($date2, $date1) {
    $now        = strtotime($date2);
    $your_date  = strtotime($date1);
    $datediff   = $now - $your_date;
    return floor($datediff / (60 * 60 * 24));
}
########################################

date_default_timezone_set($tz);
$failures   = 0;
$tests      = 0;

$dom = array ( 0, 31, 28, 31, 30,
                  31, 30, 31, 31,
                  30, 31, 30, 31 );
(array_sum($dom) === 365) || die("Thirty days hath September...");
$last   = array();
for ($year = $yearFrom; $year < $yearTo; $year++) {
    $dom[2] = 28;
    // Apply leap year rules.
    if ($year % 4 === 0)   { $dom[2] = 29; }
    if ($year % 100 === 0) { $dom[2] = 28; }
    if ($year % 400 === 0) { $dom[2] = 29; }
    for ($month = 1; $month <= 12; $month ++) {
        for ($day = 1; $day <= $dom[$month]; $day++) {
            $date = sprintf("%04d-%02d-%02d", $year, $month, $day);
            if (count($last) === 7) {
                $tests ++;
                $diff = funcdiff($date, $test = array_shift($last));
                if ((double)$diff !== (double)7) {
                    $failures ++;
                    if ($verbose) {
                        print "There seem to be {$diff} days between {$date} and {$test}\n";
                    }
                }
            }
            $last[] = $date;
        }
    }
}

print "This function failed {$failures} of its {$tests} tests between {$yearFrom} and {$yearTo}.\n";

परिणाम है,

This function failed 280 of its 14603 tests

डरावनी कहानी: "समय बचाने" की लागत

यह वास्तव में कुछ महीने पहले हुआ था। एक सरल प्रोग्रामर ने कई माइक्रोसेकंड को एक गणना से बचाने का फैसला किया, जो कि कुख्यात "(मिडनाइटऑफडेट-मिडनाइटऑफडेटा) / 86400" कोड "को कई स्थानों पर प्लग करके, लगभग तीस सेकंड लेता है। यह एक अनुकूलन के रूप में इतना स्पष्ट था कि उसने इसका दस्तावेजीकरण भी नहीं किया, और अनुकूलन ने एकीकरण परीक्षणों को पारित कर दिया और कई महीनों तक कोड में दुबका रहा, सभी किसी का ध्यान नहीं गया।

यह एक ऐसे कार्यक्रम में हुआ जो कई शीर्ष-विक्रय सेल्समैन के लिए मजदूरी की गणना करता है, जिनमें से कम से कम पांच लोगों की प्रोग्रामर टीम को एक साथ ले जाने की तुलना में एक बहुत अधिक सुखद है। कुछ महीने पहले एक दिन, उन कारणों के लिए जो कम बात करते हैं, बग मारा गया - और उन लोगों में से कुछ को वसा आयोगों के एक पूरे दिन में कमी मिली। वे निश्चित रूप से नहीं थे खुश थे।

असीम रूप से बदतर, वे (पहले से ही बहुत कम) विश्वास खो चुके थे कि कार्यक्रम में उन्हें सरप्राइज्ड तरीके से डिजाइन नहीं किया जा रहा था, और दिखावा किया - और प्राप्त किया - परीक्षण मामलों के साथ एक पूर्ण, विस्तृत कोड समीक्षा और आम आदमी की शर्तों (और बहुत कुछ) में टिप्पणी की निम्नलिखित हफ्तों में लाल कालीन उपचार)।

मैं क्या कह सकता हूं: प्लस साइड पर, हमने बहुत सारे तकनीकी ऋणों से छुटकारा पा लिया, और एक स्पेगेटी गड़बड़ के कई टुकड़ों को फिर से लिखना और फिर से लिखना शुरू कर दिया, जो झूले के 90 के दशक में एक कॉबल उल्लंघन के लिए वापस सुनाई दिए। कार्यक्रम निस्संदेह अब बेहतर चलता है, और कुछ भी गड़बड़ होने पर जल्दी शून्य होने के लिए बहुत अधिक डिबगिंग जानकारी है। मेरा अनुमान है कि बस यह आखिरी एक चीज भविष्य के लिए प्रति माह एक या दो आदमी-दिन बचाएगी।

माइनस साइड पर, पूरे ब्रूहा ने कंपनी को € 200,000 अप फ्रंट - प्लस फेस, प्लस निस्संदेह कुछ बार्गेनिंग पावर (और, इसलिए, अभी और अधिक पैसा) खर्च किया।

"अनुकूलन" के लिए जिम्मेदार व्यक्ति ने आपदा से पहले एक साल पहले नौकरी बदल दी थी, लेकिन अभी भी उसे नुकसान के लिए मुकदमा करने के लिए बात की गई थी। और यह ऊपरी पारितंत्रों के साथ अच्छी तरह से नहीं चला था कि यह "अंतिम आदमी की गलती" थी - यह हमारे लिए मामले की सफाई के लिए एक सेट-अप की तरह लग रहा था, और अंत में, हम अभी भी डॉगहाउस में हैं और टीम में से एक को छोड़ने की योजना बना रहा है।

सौ में से निन्यानबे बार, "86400 हैक" निर्दोष रूप से काम करेगा। (उदाहरण के लिए PHP में, strtotime()DST को नजरअंदाज कर देंगे और रिपोर्ट करेंगे कि अक्टूबर के अंतिम शनिवार की मध्यरात्रि और उसके बाद के सोमवारों के बीच, बिल्कुल 2 * 24 * 60 * 60 सेकंड बीत चुके हैं, भले ही वह स्पष्ट रूप से सच न हो ... और दो गलतियाँ खुशी से एक अधिकार बनायेगी)।

यह, देवियों और सज्जनों, एक उदाहरण था जब यह नहीं था। एयर बैग और सीट बेल्ट के साथ, आप शायद कभी नहीं वास्तव में जटिलता की जरूरत है (और उपयोग में आसानी) का DateTimeया Carbon। लेकिन दिन आप जब हो सकता है (या दिन आप करना होगा जब साबित आप इस बारे में सोचा) रात में एक चोर के रूप में आ जाएगा। तैयार रहो।


7
जब मैंने इन उत्तरों को देखा तो मुझे लगा कि मैं बेवकूफ और पागल हूं क्योंकि मैं हमेशा डेटटाइम का उपयोग करता हूं, लेकिन आपने मुझे समझा कि डेटाइम का उपयोग करना सही तरीका है। धन्यवाद
समकालीन बनानेवाला

अरे, यहाँ हर कोई, SO पर, यहाँ गूगल days between two days in phpया इसी तरह की खोज करके यहाँ आया है , क्योंकि जीवन में हर चीज़ को लिखना बहुत कम है।
डेनिस माताफोनोव

1
विस्तृत विवरण। + 1
अनंत सिंह ---

1
कभी-कभी मैं चाहता हूं कि हम सवाल के बजाय जवाब को पसंद कर सकें।
क्लेमेंट बेकोनियर

16

Date_diff का उपयोग करना आसान है

$from=date_create(date('Y-m-d'));
$to=date_create("2013-03-15");
$diff=date_diff($to,$from);
print_r($diff);
echo $diff->format('%R%a days');

यह डेटटाइम क्लास का उपयोग करने के लिए एक अच्छा प्रक्रियात्मक तरीका है। इसमें केवल अंतराल वस्तु ( $diffइस मामले में चर) का स्पष्ट उपयोग नहीं है । कुछ इस प्रकार है if ($diff->days > 30) { [doyourstuff]; }
गुस्तावस्तव गिल

16

वस्तु उन्मुख शैली:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

प्रक्रियात्मक शैली:

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%R%a days');

11

इसका उपयोग :)

$days = (strtotime($endDate) - strtotime($startDate)) / (60 * 60 * 24);
print $days;

अब यह काम कर रहा है


14
ऊपर बहुत पुरानी टिप्पणी है, लेकिन यह गलत है। StackOverflow है आप अपने खुद के सवाल (यहां तक कि जब आप जवाब करने की अनुमति पूछना अपने प्रश्न)। किसी को पहले से ही एक ही समाधान पोस्ट करने के बाद सवाल का जवाब देना हालांकि अशिष्ट माना जाता है।
मार्टेन बॉड्यूज

यह फ़ंक्शन 1980 और 2020 के बीच
14603

10

खैर, चयनित उत्तर सबसे सही नहीं है क्योंकि यह यूटीसी के बाहर विफल हो जाएगा। समय-सारणी ( सूची ) के आधार पर "24 घंटे" के बिना "दिन बनाने" में समय समायोजन हो सकता है, और इससे गणना (60 * 60 * 24) विफल हो जाएगी।

यहाँ यह इसका एक उदाहरण है:

date_default_timezone_set('europe/lisbon');
$time1 = strtotime('2016-03-27');
$time2 = strtotime('2016-03-29');
echo floor( ($time2-$time1) /(60*60*24));
 ^-- the output will be **1**

तो सही समाधान DateTime का उपयोग किया जाएगा

date_default_timezone_set('europe/lisbon');
$date1 = new DateTime("2016-03-27");
$date2 = new DateTime("2016-03-29");

echo $date2->diff($date1)->format("%a");
 ^-- the output will be **2**

7

दो तिथियों के बीच अंतर की गणना करें:

$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");

$diff=date_diff($date1,$date2);

echo $diff->format("%R%a days");

आउटपुट: ५:२ दिन

Date_diff () फ़ंक्शन दो DateTime ऑब्जेक्ट्स के बीच अंतर देता है।


6
$start = '2013-09-08';
$end = '2013-09-15';
$diff = (strtotime($end)- strtotime($start))/24/3600; 
echo $diff;

यह समारोह 1980 और 2020 के बीच अपने 14603 परीक्षणों में से 560 में विफल रहा।
एलएसर्नेई

6

मैं इस और इसी तरह के उद्देश्यों के लिए अपने संगीतकार परियोजनाओं में कार्बन का उपयोग कर रहा हूं ।

यह इस रूप में आसान होगा:

$dt = Carbon::parse('2010-01-01');
echo $dt->diffInDays(Carbon::now());

5

आप बस के द्वारा दिनांक पा सकते हैं

<?php
$start  = date_create('1988-08-10');
$end    = date_create(); // Current time and date
$diff   = date_diff( $start, $end );

echo 'The difference is ';
echo  $diff->y . ' years, ';
echo  $diff->m . ' months, ';
echo  $diff->d . ' days, ';
echo  $diff->h . ' hours, ';
echo  $diff->i . ' minutes, ';
echo  $diff->s . ' seconds';
// Output: The difference is 28 years, 5 months, 19 days, 20 hours, 34 minutes, 36 seconds

echo 'The difference in days : ' . $diff->days;
// Output: The difference in days : 10398

4
$datediff = floor(strtotime($date1)/(60*60*24)) - floor(strtotime($date2)/(60*60*24));

और, यदि आवश्यक हो:

$datediff=abs($datediff);

3

यदि आपके पास सेकंड (IE यूनिक्स समय टिकट) में समय है, तो आप बस समय को घटा सकते हैं और 86400 (प्रति दिन सेकंड) से विभाजित कर सकते हैं


3

PHP में दो तिथियों के बीच दिनों की संख्या

      function dateDiff($date1, $date2)  //days find function
        { 
            $diff = strtotime($date2) - strtotime($date1); 
            return abs(round($diff / 86400)); 
        } 
       //start day
       $date1 = "11-10-2018";        
       // end day
       $date2 = "31-10-2018";    
       // call the days find fun store to variable 
       $dateDiff = dateDiff($date1, $date2); 

       echo "Difference between two dates: ". $dateDiff . " Days "; 

1
महान यह आकर्षण की तरह काम किया आप मुझे बता सकते हैं कि 86400 संख्या क्या है?
पार्थ शाह

86400 नंबर 1 दिन = 24 घंटे और 24 * 60 * 60 = 86400 सेकंड के लिए एक दिन में उपयोग किया जाता है
मल्लिकार्जुन SK

3

आप नीचे दिए गए कोड को आज़मा सकते हैं:

$dt1 = strtotime("2019-12-12"); //Enter your first date
$dt2 = strtotime("12-12-2020"); //Enter your second date
echo abs(($dt1 - $dt2) / (60 * 60 * 24));

2
पुराने प्रश्नों के साथ जो मौजूदा उत्तर हैं, यह स्पष्ट करना उपयोगी है कि आपका उत्तर प्रश्न को किस नए पहलू पर लाता है। यदि प्रासंगिक है तो यह किसी भी परिवर्तन को स्वीकार करने के लिए उपयोगी है जो प्रश्न के बाद से हो सकता है।
जेसन एलर

2
function howManyDays($startDate,$endDate) {

    $date1  = strtotime($startDate." 0:00:00");
    $date2  = strtotime($endDate." 23:59:59");
    $res    =  (int)(($date2-$date1)/86400);        

return $res;
} 

यह समारोह 1980 और 2020 के बीच
14603

2

यदि आप प्रारंभ और समाप्ति तिथि के बीच सभी दिन प्रतिध्वनित करना चाहते हैं, तो मैं इसके साथ आया:

$startdatum = $_POST['start']; // starting date
$einddatum = $_POST['eind']; // end date

$now = strtotime($startdatum);
$your_date = strtotime($einddatum);
$datediff = $your_date - $now;
$number = floor($datediff/(60*60*24));

for($i=0;$i <= $number; $i++)
{
    echo date('d-m-Y' ,strtotime("+".$i." day"))."<br>";
}

2

दो तिथियों के बीच के दिनों के अंतर को खोजने का सबसे आसान तरीका

$date1 = strtotime("2019-05-25"); 
$date2 = strtotime("2010-06-23");

$date_difference = $date2 - $date1;

$result =  round( $date_difference / (60 * 60 * 24) );

echo $result;

1
    // Change this to the day in the future
$day = 15;

// Change this to the month in the future
$month = 11;

// Change this to the year in the future
$year = 2012;

// $days is the number of days between now and the date in the future
$days = (int)((mktime (0,0,0,$month,$day,$year) - time(void))/86400);

echo "There are $days days until $day/$month/$year";

1

यहाँ मेरा सुधरा हुआ संस्करण है जो 2 वर्ष बीतने पर 1 वर्ष (s) 2 महीना (दिन) 25 दिन दिखाता है।

class App_Sandbox_String_Util {
    /**
     * Usage: App_Sandbox_String_Util::getDateDiff();
     * @param int $your_date timestamp
     * @param bool $hr human readable. e.g. 1 year(s) 2 day(s)
     * @see http://stackoverflow.com/questions/2040560/finding-the-number-of-days-between-two-dates
     * @see http://qSandbox.com
     */
    static public function getDateDiff($your_date, $hr = 0) {
        $now = time(); // or your date as well
        $datediff = $now - $your_date;
        $days = floor( $datediff / ( 3600 * 24 ) );

        $label = '';

        if ($hr) {
            if ($days >= 365) { // over a year
                $years = floor($days / 365);
                $label .= $years . ' Year(s)';
                $days -= 365 * $years;
            }

            if ($days) {
                $months = floor( $days / 30 );
                $label .= ' ' . $months . ' Month(s)';
                $days -= 30 * $months;
            }

            if ($days) {
                $label .= ' ' . $days . ' day(s)';
            }
        } else {
            $label = $days;
        }

        return $label;
    }
}

1
$early_start_date = date2sql($_POST['early_leave_date']);


$date = new DateTime($early_start_date);
$date->modify('+1 day');


$date_a = new DateTime($early_start_date . ' ' . $_POST['start_hr'] . ':' . $_POST['start_mm']);
$date_b = new DateTime($date->format('Y-m-d') . ' ' . $_POST['end_hr'] . ':' . $_POST['end_mm']);

$interval = date_diff($date_a, $date_b);


$time = $interval->format('%h:%i');
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60;
//        display_error($seconds);

$second3 = $employee_information['shift'] * 60 * 60;

if ($second3 < $seconds)
    display_error(_('Leave time can not be greater than shift time.Please try again........'));
    set_focus('start_hr');
    set_focus('end_hr');
    return FALSE;
}

1
<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
?>

उपरोक्त कोड का उपयोग बहुत ही सरल है। धन्यवाद।


1
function get_daydiff($end_date,$today)
{
    if($today=='')
    {
        $today=date('Y-m-d');
    }
    $str = floor(strtotime($end_date)/(60*60*24)) - floor(strtotime($today)/(60*60*24));
    return $str;
}
$d1 = "2018-12-31";
$d2 = "2018-06-06";
echo get_daydiff($d1, $d2);

1

इस सरल कार्य का उपयोग करना। समारोह की घोषणा करें

<?php
function dateDiff($firstDate,$secondDate){
    $firstDate = strtotime($firstDate);
    $secondDate = strtotime($secondDate);

    $datediff = $firstDate - $secondDate;
    $output = round($datediff / (60 * 60 * 24));
    return $output;
}
?>

और इस फ़ंक्शन को इस तरह से कॉल करें जहां आप चाहते हैं

<?php
    echo dateDiff("2018-01-01","2018-12-31");    

// OR

    $firstDate = "2018-01-01";
    $secondDate = "2018-01-01";
    echo dateDiff($firstDate,$secondDate);    
?>

1
$diff = strtotime('2019-11-25') - strtotime('2019-11-10');
echo abs(round($diff / 86400));

2
एसओ में आपका स्वागत है! जब आप किसी पोस्ट को सिर्फ कोड के साथ रिप्लाई करते हैं, तो कृपया उसे थोड़ा समझाएं। आपके द्वारा लाया गया कोड 2019-11-10 और 2019-11-25 के बीच गणना कर रहा है। तो यह सवाल का जवाब नहीं है। यही कारण है कि अपने पीओवी को नीचा दिखाने की तुलना में बेहतर व्याख्या करना अच्छा है।
डेविड गार्सिया बोडेगो

0

यदि आप MySql का उपयोग कर रहे हैं

function daysSince($date, $date2){
$q = "SELECT DATEDIFF('$date','$date2') AS days;";
$result = execQ($q);
$row = mysql_fetch_array($result,MYSQL_BOTH);
return ($row[0]);

}

function execQ($q){
$result = mysql_query( $q);
if(!$result){echo ('Database error execQ' . mysql_error());echo $q;}    
return $result;

}


0

कार्बन का उपयोग करके देखें

$d1 = \Carbon\Carbon::now()->subDays(92);
$d2 = \Carbon\Carbon::now()->subDays(10);
$days_btw = $d1->diffInDays($d2);

इसके अलावा आप उपयोग कर सकते हैं

\Carbon\Carbon::parse('')

दिए गए टाइमस्टैम्प स्ट्रिंग का उपयोग करके कार्बन तिथि की एक वस्तु बनाना।


क्या आप बता सकते हैं कि इस और मेरे उत्तर में क्या अंतर है?
अरदा

1
एक साधारण तारीख अंतर करने के लिए, आप एक पूरे नए पैकेज सहित सुझाव देते हैं?
टोमज़ाहलिन

0

सभी उत्तरों को देखते हुए मैं सभी PHP संस्करणों पर काम करने वाले सार्वभौमिक फ़ंक्शन की रचना करता हूं।

if(!function_exists('date_between')) :
    function date_between($date_start, $date_end)
    {
        if(!$date_start || !$date_end) return 0;

        if( class_exists('DateTime') )
        {
            $date_start = new DateTime( $date_start );
            $date_end   = new DateTime( $date_end );
            return $date_end->diff($date_start)->format('%a');
        }
        else
        {           
            return abs( round( ( strtotime($date_start) - strtotime($date_end) ) / 86400 ) );
        }
    }
endif;

सामान्य तौर पर, मैं 2 तारीखों के बीच के दिनों को खोजने के लिए 'डेटटाइम' का उपयोग करता हूं। लेकिन अगर किसी कारण से, कुछ सर्वर सेटअप में 'डेटटाइम' सक्षम नहीं है, तो यह 'स्ट्रेटोटाइम ()' के साथ सरल (लेकिन सुरक्षित नहीं) गणना का उपयोग करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.