পিএইচপি ডেটইন্টারভালতে মোট সেকেন্ড গণনা করুন


101

দুটি তারিখের মধ্যে সেকেন্ডের মোট সংখ্যা গণনা করার সবচেয়ে ভাল উপায় কী? এখনও অবধি, আমি এর লাইনে কিছু চেষ্টা করেছি:

$delta   = $date->diff(new DateTime('now'));
$seconds = $delta->days * 60 * 60 * 24;

তবে daysডেটইন্টারওয়াল অবজেক্টের সম্পত্তি বর্তমান পিএইচপি 5.3 বিল্ডে নষ্ট হয়ে গেছে বলে মনে হচ্ছে (কমপক্ষে উইন্ডোজে এটি সর্বদা একই 6015মান দেয়)। আমি এটি এমনভাবে করার চেষ্টাও করেছি যা প্রতি মাসে বেশিরভাগ দিন সংরক্ষণ করতে ব্যর্থ হয় (30 থেকে 30 রাউন্ড), লিপ বছর, ইত্যাদি:

$seconds = ($delta->s)
         + ($delta->i * 60)
         + ($delta->h * 60 * 60)
         + ($delta->d * 60 * 60 * 24)
         + ($delta->m * 60 * 60 * 24 * 30)
         + ($delta->y * 60 * 60 * 24 * 365);

তবে আমি এই অর্ধ-assed সমাধানটি ব্যবহার করে সত্যই সন্তুষ্ট নই।


এর ফলাফল কী $delta->format("%r%s")?
উষ্ণতম

4
@warrenm formatযখন সমস্যাটি বলে তখন সেকেন্ডের সংখ্যা 0 হয় এবং মিনিটের সংখ্যা 1 হয়, $delta->format("%r%s")0 :(
ভাদিম

4
সবচেয়ে খারাপ বিষয়, এখন কেউ আপনার কোডের উপরের কোডটি পেস্ট করেছেন এমন কোডারের কাছ থেকে কোড পর্যালোচনায় ধরা পড়া ত্রুটিটি ঠিক করছে - প্রতি মাসে 30 দিন হয় না এবং প্রতি বছর 365 দিন থাকে না। :) [সম্পাদনা করুন: এবং সেই
কোডারটি

উত্তর:


212

আপনি কি পরিবর্তে সময় স্ট্যাম্প তুলনা করতে পারেন ?

$now = new DateTime('now');
$diff = $date->getTimestamp() - $now->getTimestamp()

11
আমার ধারণা আমি আরটিএফএম করিনি ... এটি আমি খুঁজছিলাম; অনেক ধন্যবাদ!
ইফ্রিটজ

4
+1: সুন্দর এবং পরিষ্কার! নোট করুন যে getTimestamp()পদ্ধতিটি পিএইচপি> = 5.3.0 এ উপলব্ধ।
Sk8erPeter

6
যদি আপনি আপনার ক্রেপি শেয়ার্ড হোস্টারে পিএইচপি 5.2 এর সাথে আটকে থাকেন তবে এর format('U')পরিবর্তে ব্যবহার করুন getTimestamp()
chiborg

4
আপনার সমাধান ডাব্লু / বছরের 2038 বাগটি উপযুক্ত নয়
জ্যাক এম

9
@ জ্যাকএম জানা ভাল. আমি আশা করি এখন যা নির্মিত হচ্ছে তা ২০৩ in সালে আর চলবে না 20
বেন

34

এই ফাংশনটি আপনাকে একটি ডেট ইন্টেরওয়াল অবজেক্ট থেকে সেকেন্ডে মোট সময়কাল পেতে দেয়

/**
 * @param DateInterval $dateInterval
 * @return int seconds
 */
function dateIntervalToSeconds($dateInterval)
{
    $reference = new DateTimeImmutable;
    $endTime = $reference->add($dateInterval);

    return $endTime->getTimestamp() - $reference->getTimestamp();
}

4
এটি লক্ষ্য করা উচিত যে ডেটটাইমআইমিউটেবল কেবল পিএইচপি 5.5 বা তার থেকেও উচ্চতর থেকে উপলব্ধ।
hschmieder

আমি মনে করি আপনাকে রিটার্ন ভেরিয়েবলগুলি $endTimeএবং $referenceএকে অপরের সাথে প্রতিস্থাপন করতে হবে , যেহেতু এটি আমাকে ভবিষ্যতের ব্যবধান তারিখের মান সহ একটি বিয়োগফল দেয়।
অ্যালেক্সিওয়ে

আমি মনে করি না টাইমস্ট্যাম্পটিও সেকেন্ডে রয়েছে। পিএইচপি ডেটটাইম = ভয়াবহ এপিআই
কোয়ারডিয়ামিয়াম

5

আপনি এটি এইভাবে করতে পারে:

$currentTime = time();
$timeInPast = strtotime("2009-01-01 00:00:00");

$differenceInSeconds = $currentTime - $timeInPast;

সময় () বর্তমান সময়টিকে সেকেন্ডে ফিরে আসার পর থেকে দ্বিতীয় যুগ (1970-01-01T00: 00: 00), এবং স্ট্রোটোটাইম একই কাজ করে তবে আপনি যে নির্দিষ্ট তারিখ / সময় দেন তার উপর ভিত্তি করে।


4
static function getIntervalUnits($interval, $unit)
{
    // Day
    $total = $interval->format('%a');
    if ($unit == TimeZoneCalc::Days)
        return $total;
    //hour
    $total = ($total * 24) + ($interval->h );
    if ($unit == TimeZoneCalc::Hours)
        return $total;
    //min
    $total = ($total * 60) + ($interval->i );
    if ($unit == TimeZoneCalc::Minutes)
        return $total;  
    //sec
    $total = ($total * 60) + ($interval->s );
    if ($unit == TimeZoneCalc::Seconds)
        return $total;  

    return false;
}

0

এটা সবসময় চমৎকার মতানুযায়ী যখন কি আপনার যা দরকার ইতিমধ্যে একটি শ্রেণী হিসেবে উপস্থিত। আপনার ক্ষেত্রে, আপনার মোট সেকেন্ডের সংখ্যা প্রয়োজন। এর বাইরে একটা ক্লাস তৈরি করবেন না কেন? কোডটি এর মতো দেখতে পেল:

(new TotalFullSeconds(
    new IntervalFromRange(
        new DateTimeFromISO8601String('2017-07-03T14:27:39+00:00'),
        new DateTimeFromISO8601String('2017-07-05T14:27:39+00:00')
    )
))
    ->value()

স্বজ্ঞাত হওয়ার পাশাপাশি, আপনি আপনার আইডিইয়ের স্বতঃপূরণ সুবিধা থেকেও উপকৃত হতে পারেন।

আরও কার্যকর প্রয়োগের জন্য, আপনি এই লাইব্রেরিটি পরীক্ষা করে দেখতে পারেন ।


-8

আপনি কেবল হার্ড সংখ্যাগুলিতে রেখে দিতে পারেন (60 * 60 এর পরিবর্তে - 3600 এ রেখেছিলেন) যাতে প্রতিবার তাদের গণনা করার প্রয়োজন হয় না।

সম্পাদনা - আপনার মন্তব্যের ভিত্তিতে সংখ্যাটি স্থির করে।


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