পিএইচপি-তে 2 তারিখের মধ্যে ঘন্টার সংখ্যা গণনা করুন


107

আমি কীভাবে কয়েক ঘন্টার মধ্যে দুটি তারিখের পার্থক্য গণনা করব?

উদাহরণ স্বরূপ:

day1=2006-04-12 12:30:00
day2=2006-04-14 11:30:00

এই ক্ষেত্রে ফলাফলটি 47 ঘন্টা হওয়া উচিত।


1
আমার প্রাথমিক প্রতিক্রিয়াটি হ'ত, উভয় মানকে টাইম স্ট্যাম্পগুলিতে ব্যবহার করে strftime()এবং পার্থক্যটিকে 3600 দ্বারা বিভক্ত করুন, তবে কি এটি সর্বদা কার্যকর হবে? অভিশাপ, দিবালোক সঞ্চয় সময়!
পেক্কা

@ পেপকা: না এটি সবসময় কাজ করে না বলে আমি অনুমান করি ... আমার উত্তরটি একবার দেখুন।
টাইমজোনস

@ পেক্কা, আপনি যদি strtotime()এটি ব্যবহার করেন সর্বদা কাজ করবে, আপনি যতক্ষণ না ডিফল্ট টাইমজোন ব্যবহার করেন বা স্পষ্টভাবে টাইমজোন অফসেট নির্দিষ্ট করে দেন। ডিএসটি-কে অভিশাপ দেওয়ার কোনও কারণ নেই।
ওয়াল্টার ট্রস

উত্তর:


205

নতুন পিএইচপি-সংস্করণ নামক কিছু নতুন শ্রেণীর প্রদান DateTime, DateInterval, DateTimeZoneএবং DatePeriod। এই শ্রেণীর সম্পর্কে দুর্দান্ত জিনিসটি হ'ল এটি বিভিন্ন সময় অঞ্চল, লিপ বছর, লিপ সেকেন্ড, গ্রীষ্মকালীন সময় ইত্যাদি বিবেচনা করে এবং তার উপরে এটি ব্যবহার করা খুব সহজ। এই জিনিসগুলির সাহায্যে আপনি যা চান তা এখানে:

// Create two new DateTime-objects...
$date1 = new DateTime('2006-04-12T12:30:00');
$date2 = new DateTime('2006-04-14T11:30:00');

// The diff-methods returns a new DateInterval-object...
$diff = $date2->diff($date1);

// Call the format method on the DateInterval-object
echo $diff->format('%a Day and %h hours');

ডেটইন্টারওয়ালওয়াল-অবজেক্ট, যেটি ফিরে আসে তা ছাড়াও অন্যান্য পদ্ধতি সরবরাহ করে format। আপনি যদি কেবল কয়েক ঘন্টার মধ্যে ফলাফল চান তবে আপনি এরকম কিছু করতে পারেন:

$date1 = new DateTime('2006-04-12T12:30:00');
$date2 = new DateTime('2006-04-14T11:30:00');

$diff = $date2->diff($date1);

$hours = $diff->h;
$hours = $hours + ($diff->days*24);

echo $hours;

এবং এখানে ডকুমেন্টেশনের লিঙ্কগুলি রয়েছে:

এই সমস্ত ক্লাসগুলি তারিখগুলি সহ পরিচালনা করার পদ্ধতিগত / কার্যকরী উপায়ও সরবরাহ করে। অতএব ওভারভিউটি একবার দেখুন: http://php.net/manual/book.datetime.php


+1 ভাল কাজ! এটি দৃ looks় দেখাচ্ছে এবং এটি একটি সূক্ষ্ম পর্যালোচনা। এটি উল্লেখ করা জরুরী যে বিভিন্ন ডিএসটি নিয়মের কারণে সময় অঞ্চল অনুসারে গণনাগুলি পৃথক হতে পারে, তাই সর্বদা অঞ্চলটি সংজ্ঞায়িত করা এবং সার্ভার সেটিংসের উপর নির্ভর না করা সম্ভবত ভাল ধারণা।
পেক্কা

হাঁ। এই অবজেক্টের সাহায্যে আপনি এমনকি বিভিন্ন টাইমজোনগুলির তারিখগুলির মধ্যে ক্যালকুল্যুট করতে পারেন। $date1 = new DateTime('2006-04-12T12:30:00 Europe/Berlin');এবং$date2 = new DateTime('2006-04-14T11:30:00 America/New_York');
ফিডি

3
যদি কেউ একই সমস্যার মধ্যে চলে যায় যেমন আমি ঠিক $diff->d0 সমান যেখানে হয়েছিল (কারণ আমি দুটি তারিখের মধ্যে যে ঘন্টাগুলি ঠিক 2 মাসের ব্যবধানে পৃথক করেছিলাম তা গণনা করার চেষ্টা করছি): রানিং var_dump($diff)আমাকে অন্য একটি প্যারামিটার দেখিয়েছিল: ["days"]=>int(61)তাই আমি ব্যবহার শেষ করেছি $hours = $diff->days * 24;, এবং এটি এসেছিল 2 30 দিনের মাস দেওয়া 1440 ঘন্টা "গড়" এর কাছাকাছি, সুতরাং এটি 0 এর ফলাফলের চেয়ে অনেক ভাল দেখাচ্ছে (আমার পিএইচপি সংস্করণটি অনুমান করা কিছুটা পুরানো ...)
সেমেলব্রোজেল

2
আমি বলতে চাইছি বিশ্বের অনেক জায়গায় এক বছরে একটি ২৩ ঘন্টা এবং একটি 25 ঘন্টা সময় থাকে।
ওয়াল্টার ট্রস

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

78
$t1 = strtotime( '2006-04-14 11:30:00' );
$t2 = strtotime( '2006-04-12 12:30:00' );
$diff = $t1 - $t2;
$hours = $diff / ( 60 * 60 );

4
কেন হবে না $diff / 3600?
অ্যালেক্স জি

4
@ অ্যালেক্সজি এটি একটি স্টাইলের জিনিস। একই আউটপুট, তবে প্রোগ্রামাররা যখন সময় আসে তখন গুণগুলি ব্যবহার করে
ব্যবহারকারী

আমি আপনাকে পছন্দ করতে পরামর্শ দিই: গোল (($ t1 - $ 22) / 3600); সঠিক সময় পাওয়ার জন্য গোলটি ব্যবহার করুন
শিব সিং

20

ইউটিসি বা জিএমটিDatePeriod ব্যবহার করার জন্য অন্য একটি পদ্ধতি সরবরাহ করা টাইমজোন ।

ঘন্টা গণনা করুন https://3v4l.org/Mu3HD

$start = new \DateTime('2006-04-12T12:30:00');
$end = new \DateTime('2006-04-14T11:30:00');

//determine what interval should be used - can change to weeks, months, etc
$interval = new \DateInterval('PT1H');

//create periods every hour between the two dates
$periods = new \DatePeriod($start, $interval, $end);

//count the number of objects within the periods
$hours = iterator_count($periods);
echo $hours . ' hours'; 

//difference between Unix Epoch
$diff = $end->getTimestamp() - $start->getTimestamp();
$hours = $diff / ( 60 * 60 );
echo $hours . ' hours (60 * 60)';

//difference between days
$diff = $end->diff($start);
$hours = $diff->h + ($diff->days * 24);
echo $hours . ' hours (days * 24)';

ফলাফল

47 hours (iterator_count)
47 hours (60 * 60)
47 hours (days * 24)

দিবালোক সঞ্চয় সহ ঘন্টা গণনা করুন https://3v4l.org/QBQUB

দয়া করে পরামর্শ দেওয়া উচিত DatePeriod ডিএসটি এর জন্য এক ঘন্টা বাদ দেয় কিন্তু ডিএসটি শেষ হয়ে গেলে আরও একটি ঘন্টা যোগ করে না। সুতরাং এর ব্যবহারটি আপনার পছন্দসই ফলাফল এবং তারিখের সীমা সাপেক্ষে।

বর্তমান বাগ রিপোর্ট দেখুন

//set timezone to UTC to disregard daylight savings
date_default_timezone_set('America/New_York');

$interval = new \DateInterval('PT1H');

//DST starts Apr. 2nd 02:00 and moves to 03:00
$start = new \DateTime('2006-04-01T12:00:00');  
$end = new \DateTime('2006-04-02T12:00:00');

$periods = new \DatePeriod($start, $interval, $end);
$hours = iterator_count($periods);
echo $hours . ' hours';

//DST ends Oct. 29th 02:00 and moves to 01:00
$start = new \DateTime('2006-10-28T12:00:00');
$end = new \DateTime('2006-10-29T12:00:00'); 

$periods = new \DatePeriod($start, $interval, $end);
$hours = iterator_count($periods);
echo $hours . ' hours';

ফলাফল

#2006-04-01 12:00 EST to 2006-04-02 12:00 EDT
23 hours (iterator_count)
//23 hours (60 * 60)
//24 hours (days * 24)

#2006-10-28 12:00 EDT to 2006-10-29 12:00 EST
24 hours (iterator_count)
//25 hours (60 * 60)
//24 hours (days * 24)

#2006-01-01 12:00 EST to 2007-01-01 12:00 EST
8759 hours (iterator_count)
//8760 hours (60 * 60)
//8760 hours (days * 24)

//------

#2006-04-01 12:00 UTC to 2006-04-02 12:00 UTC
24 hours (iterator_count)
//24 hours (60 * 60)
//24 hours (days * 24)

#2006-10-28 12:00 UTC to 2006-10-29 12:00 UTC
24 hours (iterator_count)
//24 hours (60 * 60)
//24 hours (days * 24)

#2006-01-01 12:00 UTC to 2007-01-01 12:00 UTC
8760 hours (iterator_count)
//8760 hours (60 * 60)
//8760 hours (days * 24)

1
আমি ডেট ইন্টেরওয়াল কনস্ট্রাক্টর প্যারামিটার দেখতে যেমন বিভ্রান্ত হয়েছিলাম কারও জন্য, ফর্ম্যাটটি হ'ল আইএসও 8601 সময়কাল
TheKarateKid

আরেকটি নোট হ'ল DateIntervalআইএসও 8601 স্পেসিফিকেশনের মতো ভগ্নাংশের মানগুলি গ্রহণ করে না। তাই P1.2Yপিএইচপি-তে কোনও বৈধ সময়কাল নয়।
fyrye

দ্রষ্টব্য: পুনরাবৃত্তি_র অ্যাকাউন্ট কেবল ইতিবাচক ফলাফল প্রদান করবে। প্রথম তারিখ যদি তার চেয়ে বেশি হয় তবে দ্বিতীয়টি পৃথক ফলাফল হবে 0
সাবজেক্টডেল্টা

1
@ সাবজেক্টডেল্টা বিষয়টির সাথে সম্পর্কিত নয় iterator_count, DatePeriodশুরুর তারিখটি শেষ তারিখ থেকে ভবিষ্যতে উপস্থিত থাকলে তারিখগুলি তৈরি করতে না পারার কারণ এটি । দেখুন: 3v4l.org/Ypsp1 নেতিবাচক তারিখটি ব্যবহার করতে, আপনাকে DateInterval::createFromDateString('-1 hour');শেষের তারিখ থেকে পূর্বের একটি শুরু তারিখ সহ একটি নেতিবাচক ব্যবধান নির্দিষ্ট করতে হবে ।
fyrye

1
@ সাবজেক্টডেল্টা এটির আর একটি উপবৃত্তি DatePeriod, ডিফল্ট হিসাবে এটি নির্দিষ্ট সময়কালের মধ্যে শুরু করার তারিখ অন্তর্ভুক্ত করবে যদি না তারা শুরু তারিখের চেয়ে কম বা সমান হয়। বাস্তবে আপনি পিএইচপি কে সময়ের সাথে 1 সেকেন্ডের মধ্যে দুটি তারিখের মধ্যে 1 ঘন্টার সময়কাল তৈরি করতে বলছেন। আপনার তারিখের অবজেক্টগুলি থেকে আপনাকে কয়েক মিনিট এবং সেকেন্ড সরিয়ে ফেলতে হবে, কারণ তারা গণনার ক্ষেত্রে প্রাসঙ্গিক নয় DateTime::setTime(date->format('H'), 0)3v4l.org/K7uss আপনি যদি 1 সেকেন্ডের মধ্যে সীমা ছাড়িয়ে যান তবে অন্য কোনও তারিখ তৈরি হয় না।
fyrye

17

আপনার উত্তরটি হ'ল:

round((strtotime($day2) - strtotime($day1))/(60*60))


5
যদি 2 ঘন্টা 30 মিনিটের মধ্যে থাকে তবে কী হবে? আপনার উত্তর 3 ঘন্টা ফলাফল হবে। আমি মনে করি মেঝে ব্যবহার করা আরও ভাল হবে যাতে 2 ঘন্টা সময় পাওয়া যায়। যদিও পরিস্থিতি উপর নির্ভর করে।
কাপিটাইন উইটবার্ড

14

দিবালোকের সময় সাশ্রয় করার সময় পরিবর্তনের পরেও দুটি তারিখের (ডেটটাইমস) মধ্যে ঘন্টার সঠিক সংখ্যার সবচেয়ে সহজ উপায় হ'ল ইউনিক্স টাইমস্ট্যাম্পগুলির মধ্যে পার্থক্যটি ব্যবহার করা। ইউনিক্স টাইমস্ট্যাম্পগুলি 1970-01-01T00: 00: 00 ইউটিসি থেকে লিপ সেকেন্ডগুলিকে অগ্রাহ্য করে সেকেন্ড হয় (এটি ঠিক আছে কারণ আপনার সম্ভবত এই নির্ভুলতার প্রয়োজন নেই, এবং অ্যাকাউন্টে লিপ সেকেন্ড নেওয়া বেশ কঠিন)।

একটি ইউনিক্স টাইমস্ট্যাম্প মধ্যে ঐচ্ছিক সময় অঞ্চল তথ্য দিয়ে একটি DATETIME স্ট্রিং রূপান্তর সবচেয়ে নমনীয় ভাবে গঠন করা হয় তারিখসময় (ঐচ্ছিকভাবে একটি সঙ্গে বস্তুর DateTimeZone কন্সট্রাকটর সালে দ্বিতীয় আর্গুমেন্ট হিসাবে), এবং তারপর তার কল getTimestamp পদ্ধতি।

$str1 = '2006-04-12 12:30:00'; 
$str2 = '2006-04-14 11:30:00';
$tz1 = new DateTimeZone('Pacific/Apia');
$tz2 = $tz1;
$d1 = new DateTime($str1, $tz1); // tz is optional,
$d2 = new DateTime($str2, $tz2); // and ignored if str contains tz offset
$delta_h = ($d2->getTimestamp() - $d1->getTimestamp()) / 3600;
if ($rounded_result) {
   $delta_h = round ($delta_h);
} else if ($truncated_result) {
   $delta_h = intval($delta_h);
}
echo "Δh: $delta_h\n";

1
একটি মন্তব্য থেকে ম্যানুয়াল এটা যে প্রদর্শিত হবে, প্রাক যুগান্তকারী তারিখ দিয়ে compatability জন্য, format("U")বাঞ্ছনীয়getTimestamp()
Arth,

1
@ আর্থ, আমি জানি না কখন এটি হয়েছিল, তবে আমার পিএইচপি 5.5.9 এ এটি আর সত্য নয়। getTimestamp()এখন ঠিক একই মান প্রদান করে format("U")। পূর্ববর্তীটি একটি পূর্ণসংখ্যা, যদিও পরবর্তীটি একটি স্ট্রিং (এখানে কম দক্ষ)।
ওয়াল্টার ট্রস

শীতল, সম্ভবত এটি পূর্ববর্তী সংস্করণে সত্য ছিল .. হ্যাঁ একটি পূর্ণসংখ্যা পরিস্কার হবে, তাই আমি getTimestamp()যদি নিশ্চিত হতে পারি তবে আমি পছন্দ করতাম ।
আর্থ

4
//Calculate number of hours between pass and now
$dayinpass = "2013-06-23 05:09:12";
$today = time();
$dayinpass= strtotime($dayinpass);
echo round(abs($today-$dayinpass)/60/60);

3
$day1 = "2006-04-12 12:30:00"
$day1 = strtotime($day1);
$day2 = "2006-04-14 11:30:00"
$day2 = strtotime($day2);

$diffHours = round(($day2 - $day1) / 3600);

আমার ধারণা স্ট্রোটাইম () ফাংশনটি এই তারিখের ফর্ম্যাটটি গ্রহণ করে।



2

দুর্ভাগ্যক্রমে ফেইলিএন প্রদত্ত সমাধান ওয়াল্টার ট্রসের বিবরণ অনুসারে কাজ করে না .. দিনগুলি 24 ঘন্টা নাও হতে পারে!

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

/**
 * @param DateTimeInterface $a
 * @param DateTimeInterface $b
 * @param bool              $absolute Should the interval be forced to be positive?
 * @param string            $cap The greatest time unit to allow
 *
 * @return DateInterval The difference as a time only interval
 */
function time_diff(DateTimeInterface $a, DateTimeInterface $b, $absolute=false, $cap='H'){

  // Get unix timestamps, note getTimeStamp() is limited
  $b_raw = intval($b->format("U"));
  $a_raw = intval($a->format("U"));

  // Initial Interval properties
  $h = 0;
  $m = 0;
  $invert = 0;

  // Is interval negative?
  if(!$absolute && $b_raw<$a_raw){
    $invert = 1;
  }

  // Working diff, reduced as larger time units are calculated
  $working = abs($b_raw-$a_raw);

  // If capped at hours, calc and remove hours, cap at minutes
  if($cap == 'H') {
    $h = intval($working/3600);
    $working -= $h * 3600;
    $cap = 'M';
  }

  // If capped at minutes, calc and remove minutes
  if($cap == 'M') {
    $m = intval($working/60);
    $working -= $m * 60;
  }

  // Seconds remain
  $s = $working;

  // Build interval and invert if necessary
  $interval = new DateInterval('PT'.$h.'H'.$m.'M'.$s.'S');
  $interval->invert=$invert;

  return $interval;
}

এটি এর মতো date_diff()একটি তৈরি করে DateTimeInterval, তবে বছরের চেয়ে বরং ঘন্টা হিসাবে সর্বোচ্চ ইউনিট দিয়ে .. এটি যথারীতি ফর্ম্যাট করা যায়।

$interval = time_diff($date_a, $date_b);
echo $interval->format('%r%H'); // For hours (with sign)

বিশেষ দ্রষ্টব্য আমি ব্যবহার করেছেন format('U')পরিবর্তে getTimestamp()মন্তব্য কারণে ম্যানুয়াল । আরও মনে রাখবেন যে e৪-বিট পরবর্তী যুগের এবং প্রাক-নেতিবাচক-যুগের তারিখগুলির জন্য প্রয়োজনীয়!


0

এই ফাংশন আপনাকে দুটি প্রদত্ত তারিখ $doj1এবং এর মধ্যে সঠিক বছর এবং মাস গণনা করতে সহায়তা করে $doj। এটি 4.3 অর্থ 4 বছর 3 মাসের উদাহরণ দেয়।

<?php
    function cal_exp($doj1)
    {
        $doj1=strtotime($doj1);
        $doj=date("m/d/Y",$doj1); //till date or any given date

        $now=date("m/d/Y");
        //$b=strtotime($b1);
        //echo $c=$b1-$a2;
        //echo date("Y-m-d H:i:s",$c);
        $year=date("Y");
        //$chk_leap=is_leapyear($year);

        //$year_diff=365.25;

        $x=explode("/",$doj);
        $y1=explode("/",$now);

        $yy=$x[2];
        $mm=$x[0];
        $dd=$x[1];

        $yy1=$y1[2];
        $mm1=$y1[0];
        $dd1=$y1[1];
        $mn=0;
        $mn1=0;
        $ye=0;
        if($mm1>$mm)
        {
            $mn=$mm1-$mm;
            if($dd1<$dd)
            {
                $mn=$mn-1;
            }
            $ye=$yy1-$yy;
        }
        else if($mm1<$mm)
        {
            $mn=12-$mm;
            //$mn=$mn;

            if($mm!=1)
            {
                $mn1=$mm1-1;
            }

            $mn+=$mn1;
            if($dd1>$dd)
            {
                $mn+=1;
            }

            $yy=$yy+1;
            $ye=$yy1-$yy;
        }
        else
        {
            $ye=$yy1-$yy;
            $ye=$ye-1;

            $mn=12-1;

            if($dd1>$dd)
            {
                $ye+=1;
                $mn=0;
            }
        }

        $to=$ye." year and ".$mn." months";
        return $ye.".".$mn;

        /*return daysDiff($x[2],$x[0],$x[1]);
         $days=dateDiff("/",$now,$doj)/$year_diff;
        $days_exp=explode(".",$days);
        return $years_exp=$days; //number of years exp*/
    }
?>

প্রস্তাবিত সম্পাদনাটি খুব সামান্য, তবে <phpপরিবর্তিত হওয়া <?phpবা প্রস্তাবিত সম্পাদনা অনুমোদিত হওয়া দরকার, যা বাগটি একসাথে সরিয়ে দেয়।
আনিশনে

0

এটি আমার প্রকল্পে কাজ করছে। আমি মনে করি, এটি আপনার পক্ষে সহায়ক হবে।

তারিখ অতীতে থাকলে উল্টোটি 1 হবে will
যদি ভবিষ্যতে তারিখটি থাকে তবে 0 টি উল্টে যাবে।

$defaultDate = date('Y-m-d');   
$datetime1   = new DateTime('2013-03-10');  
$datetime2   = new DateTime($defaultDate);  
$interval    = $datetime1->diff($datetime2);  
$days        = $interval->format('%a');
$invert      = $interval->invert;

0

একটি ইউনিক্স টাইমস্ট্যাম্প পাস করার জন্য এই স্বরলিপিটি ব্যবহার করুন

$now        = time();
$now        = new DateTime("@$now");

1
দ্রষ্টব্য টাইমজোনটি পাস হবে এবং ডেটটাইম কনস্ট্রাক্টর +0:00ব্যবহার করার সময় আউটপুট @DateTime::modify()পদ্ধতিটি ব্যবহার করার সময় টাইমস্ট্যাম্পটি পাস করবে +0:00এবং বর্তমান টাইমজোনটিকে আউটপুট দেবে। বিকল্পভাবে $date = new DateTime(); $date->setTimestamp($unix_timestamp);দেখুন: 3v4l.org/BoAWI
fyrye

0

কারবন যেতে একটি দুর্দান্ত উপায় হতে পারে।

তাদের ওয়েবসাইট থেকে:

ডেটটাইমের জন্য একটি সাধারণ পিএইচপি এপিআই এক্সটেনশন। http://carbon.nesbot.com/

উদাহরণ:

use Carbon\Carbon;

//...

$day1 = Carbon::createFromFormat('Y-m-d H:i:s', '2006-04-12 12:30:00');
$day2 = Carbon::createFromFormat('Y-m-d H:i:s', '2006-04-14 11:30:00');

echo $day1->diffInHours($day2); // 47

//...

কার্বন সহ পদ্ধতিগুলি উত্তরাধিকারী করার জন্য ডেটটাইম শ্রেণিকে প্রসারিত করে diff()। মনে হচ্ছে চমৎকার চিনি যোগ করে diffInHours, diffInMintutes, diffInSecondsইত্যাদি


0

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

$interval =
    new FromRange(
        new FromISO8601('2017-02-14T14:27:39+00:00'),
        new FromISO8601('2017-03-14T14:27:39+00:00')
    );

FromISO8601 একই শব্দার্থতত্ত্ব রয়েছে: এটি একটি ডেটটাইম অবজেক্ট তৈরি করা হয়েছে from iso8601-formatted string , তাই নাম।

যখন আপনার একটি বিরতি রয়েছে, আপনি পছন্দ মতো তবে এটি ফর্ম্যাট করতে পারেন। আপনার যদি বেশ কয়েকটি পুরো ঘন্টা দরকার হয় তবে আপনি নিতে পারেন

(new TotalFullHours($interval))->value();

আপনি যদি সিলিং মোট ঘন্টা চান তবে এখানে যান:

(new TotalCeiledHours($interval))->value();

এই পদ্ধতির এবং কিছু উদাহরণ সম্পর্কে আরও তথ্যের জন্য, এই এন্ট্রিটি দেখুন


0

@ ফাইরির খুব সহায়ক জবাব ছাড়াও এটি উল্লিখিত বাগের জন্য একটি Okayish workaround (এটির একটি) ), যে DatePeriod এক ঘন্টার substracts যখন গ্রীষ্মের লিখে, কিন্তু গ্রীষ্মের যাব (এবং এইভাবে ইউরোপ / বার্লিনের মার্চ তার রয়েছে এক ঘন্টার যোগ না সঠিক 743 ঘন্টা তবে অক্টোবরে 745 ঘন্টার পরিবর্তে 744 রয়েছে):

উভয় দিকে ডিএসটি-ট্রানজিশন বিবেচনা করে এক মাসের ঘন্টা (বা কোনও টাইমস্প্যান) গণনা করা হচ্ছে

function getMonthHours(string $year, string $month, \DateTimeZone $timezone): int
{
    // or whatever start and end \DateTimeInterface objects you like
    $start = new \DateTimeImmutable($year . '-' . $month . '-01 00:00:00', $timezone);
    $end = new \DateTimeImmutable((new \DateTimeImmutable($year . '-' . $month . '-01 23:59:59', $timezone))->format('Y-m-t H:i:s'), $timezone);
    
    // count the hours just utilizing \DatePeriod, \DateInterval and iterator_count, hell yeah!
    $hours = iterator_count(new \DatePeriod($start, new \DateInterval('PT1H'), $end));
    
    // find transitions and check, if there is one that leads to a positive offset
    // that isn't added by \DatePeriod
    // this is the workaround for https://bugs.php.net/bug.php?id=75685
    $transitions = $timezone->getTransitions((int)$start->format('U'), (int)$end->format('U'));
    if (2 === count($transitions) && $transitions[0]['offset'] - $transitions[1]['offset'] > 0) {
        $hours += (round(($transitions[0]['offset'] - $transitions[1]['offset'])/3600));
    }
    
    return $hours;
}

$myTimezoneWithDST = new \DateTimeZone('Europe/Berlin');
var_dump(getMonthHours('2020', '01', $myTimezoneWithDST)); // 744
var_dump(getMonthHours('2020', '03', $myTimezoneWithDST)); // 743
var_dump(getMonthHours('2020', '10', $myTimezoneWithDST)); // 745, finally!

$myTimezoneWithoutDST = new \DateTimeZone('UTC');
var_dump(getMonthHours('2020', '01', $myTimezoneWithoutDST)); // 744
var_dump(getMonthHours('2020', '03', $myTimezoneWithoutDST)); // 744
var_dump(getMonthHours('2020', '10', $myTimezoneWithoutDST)); // 744

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


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