দুটি তারিখের মধ্যে দিনের সংখ্যা সন্ধান করা


615

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



5
একটি লাইনার:(new DateTime("2010-01-11"))->diff(new DateTime("2019-08-19"))->days;
বিলিএনও

@ বিলিন্নাহ - এটিই সবচেয়ে পরিষ্কার এবং সহজ উত্তর!
রোলিংগার

উত্তর:


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
লিপ সেকেন্ড ভুলে যান (না, আসলে সেগুলিও বিবেচনা করুন) তবে এটি দিবালোকের সময় সংরক্ষণের পরিবর্তনের জন্য দায়ী নয়! এটি প্রতি বছর এই সীমানাগুলির উপর দিয়ে পুরো দিন বন্ধ হয়ে যেতে পারে। আপনার ডেটটাইম ক্লাস ব্যবহার করা দরকার।
লেবি

6
@ বিলিনাঃ দুঃখিত, আমি আমার মন্তব্য আপডেট করতে ফিরে আসিনি। দিবালোক সাশ্রয়কারী সময় অঞ্চলগুলি সম্পর্কে আপনাকে সতর্কতা অবলম্বন করতে হবে। যদি আপনি দিনের আলোর সঞ্চয়ের সাথে কোনও তারিখের তুলনা করেন তবে তা ছাড়া একটি তারিখ আবার ব্যবহার করে, উদাহরণস্বরূপ 7 দিনের পরিবর্তে এটি 6.9 দিন ফিরে আসে। মেঝেটি গ্রহণের পরিবর্তে 6 এর পরিবর্তে returns টি ফিরে আসে
অ্যালেক্স অ্যাঞ্জেলিকো

4
20 বছরের মধ্যে কেবল স্ট্রোটোটাইম () ব্যর্থ হয় না, এটি এখনই অব্যবহারযোগ্য। ওপি সময়কে নয়, তারিখগুলি নির্দিষ্ট করে। তারিখগুলি বেশ পুরানো হতে পারে। এখানে একটি সহজ উত্তর: $ নম্বরডেস = গ্রেগোরিয়ান্টোজেড ($ এন্ডএম, $ এন্ডডি, $ এন্ডওয়াই) - গ্রেগরিয়ানটোজড ($ স্টার্টএম, $ স্টার্টডি, $ স্টার্টওয়াই); (একটি অন্তর্ভুক্ত ব্যাপ্তির জন্য)। ডেটটাইম ক্লাসের বিপরীতে গ্রেগরিয়ান থেকে জুলিয়ান ভি 4 আপ-এ পাওয়া যায়। বৈধ পরিসীমাটি 4714 বিসি থেকে 9999 এডি অবধি ফান্সি প্যারামিটার অর্ডার থেকে সাবধান থাকুন (যেমন পিএইচপি-র জন্য আপনাকে সেই সতর্কতা দরকার)।
গাই গর্ডন

521

আপনি যদি ব্যবহার করে থাকেন 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
xeo

13
মনে রাখবেন যে আপনার তারিখগুলিতে যদি সময় থাকে তবে এটি আপনার প্রত্যাশার মতো কাজ করবে না। উদাহরণস্বরূপ, যদি আপনার 23:30 ঘন্টা ব্যবধান থাকে ... এবং তারা বিভিন্ন দিনে থাকে তবে পার্থক্য 0 হবে
লেইক

19
আপনার যদি দিনের তুলনামূলক সংখ্যার প্রয়োজন হয় ( $date1পূর্বে যখন নেতিবাচক থাকে $date2) তবে তার $diff = $date2->diff($date1)->format("%r%a");পরিবর্তে ব্যবহার করুন।
সোকস

1
তারিখের বিন্যাসটি কী DateTime("2010-07-06")??, এটি Y-m-dবা Y-d-m?, DateTimeপ্যারামিটারের বিন্যাসটি কী? কোনটি দিন?
151291

165

পিএইচপি সংস্করণ 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
আমি সম্মত, অনুসরণ করা খুব সহজ এবং দুর্দান্ত কাজ করে !!! শুধু ডেট_ডেফল্ট_টাইমজোন_সেট () ফাংশনটি ব্যবহার করতে ভুলবেন না বা এটি ইউটিসি সময়ের উপর ভিত্তি করে আপনাকে অদ্ভুত ফলাফল দেবে।
জেকডুড

2
এই ফাংশনটি 1980 ও 2020 মধ্যে 14603 পরীক্ষার 0 ব্যর্থ
LSerni

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পরের পুরো দিন পর্যন্ত কয়েক রাউন্ড ব্যবহার করে of floorপরিবর্তে যদি আপনি এই দুটি তারিখের মধ্যে পুরো দিনের পরিমাণ পেতে চান তবে ব্যবহার করুন ।

যদি আপনার তারিখগুলি ইতিমধ্যে ইউনিক্স টাইমস্ট্যাম্প ফর্ম্যাটে থাকে তবে আপনি রূপান্তরটি এড়িয়ে যেতে পারেন এবং কেবল $days_betweenঅংশটি করতে পারেন। আরও বহিরাগত তারিখের ফর্ম্যাটগুলির জন্য, এটি সঠিক করতে আপনাকে কিছু কাস্টম পার্সিং করতে হতে পারে।


9
ডিএসটি সম্পর্কে কী?
toon81

3
@ টুন81 - আমরা এই জাতীয় জঞ্জাল এড়াতে ইউনিক্স টাইমস্ট্যাম্প ব্যবহার করি ! ;)
অ্যালাস্টার

6
আমাকে বিশদভাবে বলতে দাও: আজ সকাল 3 টায় প্রায় পুরো ইউরোপ ঘড়িটি এক ঘন্টা পিছনে সরিয়ে নিয়েছিল। এর অর্থ হ'ল আজকের অতিরিক্ত 3600 সেকেন্ড রয়েছে এবং এটি ইউনিক্স টাইমস্ট্যাম্পগুলিতে প্রতিফলিত হওয়া উচিত। যদি এটি হয়, তবে এর অর্থ হ'ল আজকের দিনগুলি গণনার উপরোক্ত উপায়ের সাথে দু'দিন গণনা করবে। এবং আমি এমনকি লিপ সেকেন্ডের শুরুও করছি না যেহেতু পিএইচপি বা ইউনিক্স উভয়ই তাদের জন্য অ্যাকাউন্ট করে না (যা আইএমও আসলে বোধগম্য)। টিএল; ডিআর: সমস্ত দিন 86,400 সেকেন্ড দীর্ঘ নয়
toon81

2
@ toon81 এই তারিখের জন্য আরও 3600 সেকেন্ড নেই। ইউএসএক্স টাইমস্ট্যাম্পের সাথে ডিএসটি যেতে বা যাওয়ার সময় কিছুই হয় না।
নিকডনক

1
যদি ইউনিক্স টাইমস্ট্যাম্পের কিছু না ঘটে, তবে আপনি আমার সাথে একমত হন: 1PM অন $dayইউনিক্স টাইমস্ট্যাম্প এবং 1PM-তে UNIX টাইমস্ট্যাম্পের মধ্যে পার্থক্য $day+1সবসময় ডিএসটি পর্যবেক্ষণ টাইমজোনগুলিতে 86400 সেকেন্ড নয় not এটি 24 ঘন্টার পরিবর্তে 23 বা 25 ঘন্টা সেকেন্ডের হতে পারে।
toon81

111

TL; DR ইউনিক্স টাইমস্ট্যাম্প ব্যবহার করবেন নাব্যবহার করবেন না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' দিনের সম্পূর্ণ সংখ্যা বোঝায় । আপনি যদি এটি স্বাক্ষরিত পূর্ণসংখ্যা হিসাবে চান, অর্থাৎ দ্বিতীয় তারিখ প্রথম হওয়ার আগে isণাত্মক হয়, তবে আপনাকে '% r' উপসর্গটি (যেমন format('%r%a')) ব্যবহার করতে হবে ।


আপনার যদি সত্যিই ইউনিক্স টাইমস্ট্যাম্পগুলি অবশ্যই ব্যবহার করতে হয় তবে নীচে বিস্তারিত বেশিরভাগ সমস্যাগুলি এড়াতে সময় অঞ্চলটি GMT এ সেট করুন


দীর্ঘ উত্তর: কেন 24 * 60 * 60 (ওরফে 86400) দ্বারা ভাগ করা অনিরাপদ

UNIX টাইমস্ট্যাম্পগুলি ব্যবহার করে (এবং 86400 কে এই দিনগুলিতে রূপান্তর করতে) বেশিরভাগ উত্তর দুটি অনুমান করে যা একসাথে রাখলে, ভুল ফলাফল এবং সূক্ষ্ম বাগগুলির সাথে পরিস্থিতি তৈরি করতে পারে যা ট্র্যাক করা কঠিন হতে পারে এবং কয়েক দিন, সপ্তাহ বা কয়েক মাস পরেও উত্থিত হতে পারে একটি সফল স্থাপনা। এটি এমন নয় যে সমাধানটি কাজ করে না - এটি কাজ করে। আজ. তবে এটি আগামীকাল কাজ বন্ধ করে দিতে পারে।

"গতকাল থেকে কত দিন কেটে গেছে?" যখন জিজ্ঞাসা করা হয়েছিল যে প্রথম ভুলটি এটি বিবেচনা করছে না, কোনও কম্পিউটার যদি পুরো দিনটির চেয়েও কম সময় পার করে "গতকাল" নির্দেশিত তাত্ক্ষণিকের মধ্যে উপস্থিত থাকে এবং তাত্ক্ষণিকতার মধ্যে শূন্যতার উত্তর দিতে পারে ।

সাধারণত "দিন" কে ইউনিক্স টাইমস্ট্যাম্পে রূপান্তর করার সময়, যা পাওয়া যায় তা সেই নির্দিষ্ট দিনের মধ্যরাতের টাইমস্ট্যাম্প ।

সুতরাং ১ লা অক্টোবর এবং 15 ই অক্টোবর মধ্যরাতের মধ্যে, পনের দিন অতিবাহিত হয়েছে। তবে পহেলা অক্টোবরের 13:00 থেকে 15 ই অক্টোবর 14:55 এর মধ্যে পনের দিন বিয়োগ 5 মিনিট সময় কেটে গেছে এবং অন্তর্ভুক্ত floor()পূর্ণসংখ্যার রূপান্তর ব্যবহার বা করা বেশিরভাগ সমাধান প্রত্যাশার চেয়ে একদিন কম রিপোর্ট করবে

সুতরাং, "কত দিন আগে Ymd H: i: s" ছিল? সমর্পণ করা হবে ভুল উত্তর

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

সুতরাং আপনি যদি নির্দিষ্ট সময়ের জন্য সমস্ত তারিখের টাইমস্ট্যাম্পগুলিকে বাধ্য করার "হ্যাক" ব্যবহার করেন, এমনকি মধ্যরাতটি বলুন (আপনি কেবল দিন-মাস-বছর নির্দিষ্ট করেন এবং ঘন্টা-মিনিট-সেকেন্ড না করেও বিভিন্ন ভাষা এবং ফ্রেমওয়ার্ক দ্বারা স্পষ্টভাবে এটি করা হয়; DET টাইপ সহ একই হ্যাপপেনগুলি যেমন মাইএসকিউএল) যেমন বহুল ব্যবহৃত সূত্র in

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

অথবা

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

ফিরে আসবে, বলুন, 17 যখন DATE1 এবং DATE2 বছরের একই ডিএসটি বিভাগে থাকে; তবে এটি 17.042, এবং আরও খারাপ হতে পারে, 16.958 এ ফিরে আসতে পারে। ব্যবহারের মেঝে () বা পূর্ণসংখ্যা কোনো অন্তর্নিহিত ছাঁটাই তারপর রূপান্তর করব তা হওয়া উচিত ছিল একটি 16 অন্যান্য পরিস্থিতির ইন 17, মত এক্সপ্রেশন "$ দিন> 17" ফিরে আসবে true17,042 জন্য এমনকি যদি এটি ইঙ্গিত করে যে ব্যায়িত দিন গণনার 18 বছর।

প্ল্যাটফর্মগুলিতে এই জাতীয় কোড পোর্টেবল না হওয়ায় জিনিসগুলি আরও খারাপ আকার ধারণ করে , কারণ তাদের মধ্যে কিছু লিপ সেকেন্ড প্রয়োগ করতে পারে এবং কিছু নাও পারে । সেই প্ল্যাটফর্মের যে উপর না , দুইটি তারিখের মধ্যে পার্থক্য 86400 কিন্তু 86401, হয়তো বা 86399. হবে না তাই কোডটি মে মাসে কাজ করেন এবং আসলে পাস সমস্ত পরীক্ষার জুন পরবর্তী ভঙ্গ করবে যখন 12.99999 দিন পরিবর্তে 12 দিন 13. দুটি তারিখের বলে মনে করা হয় 2015 সালে কাজ করা 2017 সালে কাজ করবে না - একই তারিখগুলি, এবং কোনও বছরই একটি লিপ বছর নয়। তবে 2018-03-01 এবং 2017-03-01 এর মধ্যে, সেই প্ল্যাটফর্মে যেগুলি যত্নশীল, 365 এর পরিবর্তে 366 দিন কেটে যাবে, 2018 কে একটি লিপ বছর তৈরি করবে (যা এটি নয়)।

সুতরাং আপনি যদি সত্যিই ইউনিক্স টাইমস্ট্যাম্প ব্যবহার করতে চান:

  • 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()সুরক্ষিতভাবে ছাঁটাই করতে পারেন ।

সঠিক সমাধান যদিও, জাদু ধ্রুবক, rounding kludges এবং একটি রক্ষণাবেক্ষণ ঋণ এড়াতে, হয়

  • একটি সময় গ্রন্থাগার (ডেটটাইম, কার্বন, যাই হোক না কেন) ব্যবহার করুন; আপনার নিজের রোল করবেন না

  • সত্যিই অশুভ তারিখ পছন্দগুলি ব্যবহার করে ব্যাপক পরীক্ষার কেসগুলি লিখুন - ডিএসটি সীমানা জুড়ে, লিপ বছরগুলিতে, লিপ সেকেন্ড জুড়ে এবং সেইসাথে সাধারণ তারিখগুলি। আদর্শভাবে (ডেটটাইমের কাছে কলগুলি দ্রুত হয় !) স্ট্রিং থেকে ক্রমানুসারে একত্র করে চারটি পুরো বছর (এবং একদিন) মূল্যবান তারিখ উত্পন্ন করে এবং নিশ্চিত করে যে প্রথম দিন এবং পরীক্ষিত দিনের মধ্যে পার্থক্য একের পর এক স্থিরভাবে বৃদ্ধি পায় increases এর ফলে যদি নিম্ন স্তরের রুটিন এবং লিপ সেকন্ড কিছু পরিবর্তন সংশোধন করা হয়েছে প্রতিহিংসা গ্রহণ ব্যাপক ধ্বংস করার চেষ্টা করুন, অন্তত আপনি হবে জানি

  • বাকি টেস্ট স্যুটের সাথে নিয়মিত এই পরীক্ষাগুলি চালান। এগুলি মিলিসেকেন্ডের বিষয় এবং এটি আপনাকে আক্ষরিক অর্থে কয়েক ঘন্টা মাথা চুলকায় বাঁচাতে পারে ।


আপনার সমাধান যাই হোক না কেন, এটি পরীক্ষা!

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" কোড প্লাগ করে বেশিরভাগ সর্বাধিক প্রায় ত্রিশ সেকেন্ড সময় গণনা থেকে বেশ কয়েকটি মাইক্রোসেকেন্ডগুলি সংরক্ষণ করার সিদ্ধান্ত নিয়েছে। এটি এতটা সুস্পষ্ট একটি অপ্টিমাইজেশন ছিল যে তিনি এটি দলিলও করেননি এবং অপ্টিমাইজেশানটি ইন্টিগ্রেশন পরীক্ষায় পাস করেছে এবং কয়েক মাস ধরে কোডটিতে লুকিয়ে রেখেছে, সবার নজরে নেই।

এটি এমন একটি প্রোগ্রামে ঘটেছিল যা বেশ কয়েকটি শীর্ষে বিক্রয়কারী বিক্রয়কর্মীদের মজুরি গণনা করে, যার মধ্যে কমপক্ষে একটি সম্পূর্ণ নম্র পাঁচ-লোক প্রোগ্রামার দলকে একত্রিত করার চেয়ে ভয়ঙ্কর অনেক বেশি আটকানো হয়। এক মাস কয়েক মাস আগে, যে কারণে সামান্য ব্যাপার, ত্রুটিটি আঘাত করেছিল - এবং এই ছেলেগুলির মধ্যে কয়েকটি পুরো দিন ফ্যাট কমিশনগুলির সংক্ষিপ্ত হয়ে পড়েছিল । তারা অবশ্যই আনন্দিত ছিল না

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

আমি কী বলতে পারি: প্লাস পাশে, আমরা প্রচুর প্রযুক্তিগত debtণ থেকে মুক্তি পেয়েছি, এবং একটি স্প্যাগেটি গণ্ডগোলের কয়েকটি টুকরো পুনর্লিখন এবং রিফ্যাক্টর করতে সক্ষম হয়েছি যা ১৯৯০ এর দশকে কোনও সিওবিওএল আক্রমণে ফিরে এসেছিল hear প্রোগ্রামটি নিঃসন্দেহে এখন আরও ভাল চলেছে এবং যখন কোনও কিছু মাছধরা দেখায় তখন দ্রুত শূন্য করতে আরও অনেক ডিবাগিং তথ্য রয়েছে। আমি অনুমান করেছি যে কেবলমাত্র এই শেষ জিনিসটি ভবিষ্যতের জন্য সম্ভবত মাসে এক বা দু'জন মানব-দিন বাঁচাতে পারে।

বিয়োগের দিকে, পুরো ব্রোউহাহা সংস্থাটি প্রায় 200,000 ডলার সামনের দিকে - আরও মুখোমুখি, নিঃসন্দেহে কিছু দর কষাকষির ক্ষমতা (এবং, তাই আরও বেশি অর্থ))

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

একশত উনিশবার বার, "86400 হ্যাক" নির্দোষভাবে কাজ করবে। (উদাহরণস্বরূপ, পিএইচপি-তে, strtotime()ডিএসটি উপেক্ষা করে রিপোর্ট করবে যে অক্টোবরের শেষ শনিবারের মধ্যরাত এবং নিম্নলিখিত সোমবারের মধ্যে, ঠিক 2 * 24 * 60 * 60 সেকেন্ড পেরিয়ে গেছে, এমনকি যদি তা স্পষ্টভাবে সত্য নাও হয় ... এবং দুটি ভুল আনন্দের সাথে একটিকে সঠিক করে তুলবে)।

মহিলা ও ভদ্রলোকরা, এটির এক নজির ছিল যখন তা হয় নি। এয়ার ব্যাগ এবং সীট বেল্ট সঙ্গে হিসাবে, আপনি সম্ভবত হবে না সত্যিই জটিলতা হবে (এবং ব্যবহার কর্মের) এর DateTimeবা Carbon। কিন্তু দিন যখন আপনি পারে (অথবা যেদিন তুমি করতে হবে যখন প্রমাণ আপনি এই সম্পর্কে চিন্তা) চোরের যেমন আসতে হবে। প্রস্তুত হও.


7
আমি যখন এই উত্তরগুলি দেখেছি তখন আমি ভেবেছিলাম আমি বোকা এবং পাগল কারণ আমি সর্বদা ডেটটাইম ব্যবহার করি তবে আপনি আমাকে বুঝতে পেরেছিলেন যে ডেটটাইম ব্যবহার করা সঠিক উপায়। আপনাকে ধন্যবাদ
Syncro

আরে, এখানে সকলেই, এসও তে, গুগল days between two days in phpবা অনুরূপ অনুসন্ধান করে এখানে এসেছিল , কারণ নিজের জীবন নিজেকে লেখার পক্ষে খুব ছোট।
ডেনিস মাটাফোনভ

1
বিস্তারিত ব্যাখ্যা। + 1
অনন্ত সিং ---

1
কখনও কখনও আমি আশা করি আমরা প্রশ্নের পরিবর্তে উত্তরগুলি পছন্দ করতে পারি।
ক্লামেন্ট বেকননিয়ার

16

ডেট_ডিফ ব্যবহার করা সহজ

$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 পরীক্ষার 560
টিতে

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**

সুতরাং সঠিক সমাধানটি ডেটটাইম ব্যবহার করবে

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");

আউটপুট: +272 দিন

তারিখ_ডিফ () ফাংশন দুটি ডেটটাইম অবজেক্টের মধ্যে পার্থক্য প্রদান করে।


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

আপনার যদি সেকেন্ডে সময় হয় (আই ইউনিক্স টাইম স্ট্যাম্প), তবে আপনি কেবল সময়গুলি বিয়োগ করতে পারেন এবং 86400 (প্রতি সেকেন্ডে) দ্বারা ভাগ করতে পারেন


3

পিএইচপি-তে দুটি তারিখের মধ্যে দিনের সংখ্যা

      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 সেকেন্ডের জন্য একদিনে ব্যবহৃত হয়
মল্লিকার্জুন এস কে

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 পরীক্ষার 320
টিতে

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

এখানে আমার উন্নত সংস্করণ যা দ্বিতীয় প্যারামিটারটি পাস করা হলে 1 বছর (মাস) 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
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

সমস্ত উত্তর খুঁজছি আমি সর্বজনীন ফাংশন রচনা করছি সমস্ত পিএইচপি সংস্করণে কী কাজ করছে।

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 তারিখের মধ্যে দিনগুলি খুঁজতে 'ডেটটাইম' ব্যবহার করি। তবে যদি কোনও কারণে, কিছু সার্ভার সেটআপে 'ডেটটাইম' সক্ষম না করা হয়, তবে এটি 'স্ট্রোটোটাইম ()' দিয়ে সহজ (তবে নিরাপদ নয়) গণনা ব্যবহার করবে।

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