সেকেন্ডকে দিন, ঘন্টা, মিনিট এবং সেকেন্ডে রূপান্তর করুন


92

আমি একটি পরিবর্তনশীল $uptimeযা সেকেন্ড, দিন, ঘন্টা, মিনিট এবং সেকেন্ডে রূপান্তর করতে চাই ।

উদাহরণ:

$uptime = 1640467;

ফলাফল হওয়া উচিত:

18 days 23 hours 41 minutes

উত্তর:


218

এটি দিয়ে অর্জন করা যেতে পারে DateTime ক্লাস

ব্যবহার:

echo secondsToTime(1640467);
# 18 days, 23 hours, 41 minutes and 7 seconds

ফাংশন:

function secondsToTime($seconds) {
    $dtF = new \DateTime('@0');
    $dtT = new \DateTime("@$seconds");
    return $dtF->diff($dtT)->format('%a days, %h hours, %i minutes and %s seconds');
}

demo


@ গ্লাভিć আমি কীভাবে এই সপ্তাহে এবং মাসের জন্য সমর্থন যুক্ত করব?
socca1157

4
ফাংশনটিতে বৈধতা যোগ করতে ভুলবেন না। যদি (খালি ($ সেকেন্ড)) false মিথ্যা প্রত্যাবর্তন করে;}
একটি কোডার

4
@ অ্যাকোডার: আমি মনে করি এই ফাংশনটি বৈধতার যত্ন নেওয়া উচিত নয়; ফাংশন কল করার আগে বৈধতা সেটআপ করা উচিত। তবুও, আপনার বৈধতা এখনও ভুল, কারণ উদাহরণস্বরূপ এটি বর্ণমালাও পাস করবে।
গ্লাভিć

4
কনস্ট্রাক্টরের @পক্ষে আর্গুমেন্ট হিসাবে পাস করার অর্থ কী DateTime?
ইভানকা টডোরোভা

4
@ ইভানকাটোডোরোভা: @ইউনিক্স টাইমস্ট্যাম্পের পরে মান ।
গ্লাভিć

45

দিনগুলি অন্তর্ভুক্ত করার জন্য এটি পুনরায় লিখিত ফাংশন। কোডটি বুঝতে সহজ করে তুলতে আমি পরিবর্তনশীল নামগুলিও পরিবর্তন করেছি ...

/** 
 * Convert number of seconds into hours, minutes and seconds 
 * and return an array containing those values 
 * 
 * @param integer $inputSeconds Number of seconds to parse 
 * @return array 
 */ 

function secondsToTime($inputSeconds) {

    $secondsInAMinute = 60;
    $secondsInAnHour  = 60 * $secondsInAMinute;
    $secondsInADay    = 24 * $secondsInAnHour;

    // extract days
    $days = floor($inputSeconds / $secondsInADay);

    // extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = floor($hourSeconds / $secondsInAnHour);

    // extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = floor($minuteSeconds / $secondsInAMinute);

    // extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = ceil($remainingSeconds);

    // return the final array
    $obj = array(
        'd' => (int) $days,
        'h' => (int) $hours,
        'm' => (int) $minutes,
        's' => (int) $seconds,
    );
    return $obj;
}

উত্স: কোডএড () - http://codeaid.net/php/convert-seconds-to-hours-minutes-and-seconds-(php)


উত্স
মার্টিন

আপনি কি এই ফাংশনটিতে দিন যোগ করার জন্য যথেষ্ট সদয় হন?
নিটলডান

@ কিতিটলডান, তেমন উপস্থিত হয় না :)
এও_

4
@ hsmoore.com আমি এগিয়ে গেলাম এবং এটি বের করে ফেললাম $ দিনগুলি = তল ($ সেকেন্ড / (60 * 60 * 24)); // এক্সট্রাক্ট ঘন্টা $ ডিভাইডার_ফর্ম_আউটস = $ সেকেন্ড% (60 * 60 * 24); $ ঘন্টা = তল ($ বিভাজক_ জন্য_ ঘন্টা / (60 * 60%));
নিটলডান

4
এটি দিনের জন্য প্রত্যাশার মতো কাজ করে না। আপনাকে $ ঘন্টা থেকে ($ দিন * ২৪) বিয়োগ করতে হবে, নাহলে দিনের মধ্যে ঘন্টাগুলি $ দিন এবং $ ঘন্টাগুলিতে দ্বিগুণ গণনা করা হবে। যেমন ইনপুট 100000 => 1 দিন এবং 27 ঘন্টা 27 এটি 1 দিন 3 ঘন্টা হওয়া উচিত।
ফাইনিটেলুপ

32

জুলিয়ান মোরেনোর উত্তরের উপর ভিত্তি করে, তবে প্রতিক্রিয়াটিকে স্ট্রিং (কোনও অ্যারে নয়) হিসাবে দিতে পরিবর্তিত হয়েছে, কেবলমাত্র সময়ের ব্যবধানগুলি অন্তর্ভুক্ত করুন এবং বহুবচনটি অনুমান করবেন না।

এটি এবং সর্বাধিক ভোট দেওয়া উত্তরের মধ্যে পার্থক্য:

জন্য 259264সেকেন্ড, এই কোড দিতে হবে

3 দিন, 1 মিনিট, 4 সেকেন্ড

জন্য 259264সেকেন্ড, সর্বোচ্চ (Glavić দ্বারা) উত্তর ভোট দিতে হবে

3 দিন, 0 ঘন্টা , 1 মিনিট s এবং 4 সেকেন্ড

function secondsToTime($inputSeconds) {
    $secondsInAMinute = 60;
    $secondsInAnHour = 60 * $secondsInAMinute;
    $secondsInADay = 24 * $secondsInAnHour;

    // Extract days
    $days = floor($inputSeconds / $secondsInADay);

    // Extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = floor($hourSeconds / $secondsInAnHour);

    // Extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = floor($minuteSeconds / $secondsInAMinute);

    // Extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = ceil($remainingSeconds);

    // Format and return
    $timeParts = [];
    $sections = [
        'day' => (int)$days,
        'hour' => (int)$hours,
        'minute' => (int)$minutes,
        'second' => (int)$seconds,
    ];

    foreach ($sections as $name => $value){
        if ($value > 0){
            $timeParts[] = $value. ' '.$name.($value == 1 ? '' : 's');
        }
    }

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

আমি আশা করি এটা কারো সাহায্যে লাগবে.


4
আমি এটিকে পছন্দ করি কারণ এটি "1 ঘন্টা" থেকে "গুলি" সরিয়ে দেয় এবং আমার ক্ষেত্রে, আমি দিনগুলি সরাতে চেয়েছিলাম এবং কেবলমাত্র একটি প্রচুর ঘন্টা গণনা করতে চাইছিলাম এবং এই পদ্ধতিটি <<3 এর সাথে মানিয়ে নেওয়া খুব সহজ ছিল।
রায়ান এস

4
খুব সুন্দর লুক, এটি কমপ্যাক্ট এবং পরিষ্কার রেখে!
ভয়েডজেডা

21

এখানে এটি একটি সাধারণ 8-লাইন পিএইচপি ফাংশন যা বহু পরিমাণ সেকেন্ডের জন্য কয়েক মাস সহ মানব পাঠযোগ্য স্ট্রিংয়ে রূপান্তরিত করে:

পিএইচপি ফাংশন সেকেন্ডস হিউম্যান ()

function seconds2human($ss) {
$s = $ss%60;
$m = floor(($ss%3600)/60);
$h = floor(($ss%86400)/3600);
$d = floor(($ss%2592000)/86400);
$M = floor($ss/2592000);

return "$M months, $d days, $h hours, $m minutes, $s seconds";
}

4
সাধারণ এখনও দক্ষ। যদিও আমি 'মাস' বিট পছন্দ করি না।
ফ্রান্সিসকো প্রেজেনসিয়া

4
আপনার উত্তরে কোডটি অন্তর্ভুক্ত করা উচিত, অন্য পৃষ্ঠায় লিঙ্ক নয়। আপনি যে ওয়েবসাইটের সাথে লিঙ্ক করছেন সেটি এখনও আগামীকালেই থাকবে তা নিখুঁত করার কোনও উপায় নেই
জাচারি ওয়েলিক্সেলাম

আমাদের সহজ সমাধান সরবরাহ করার জন্য আপনার প্রচেষ্টার জন্য আপনাকে অনেক ধন্যবাদ
আদনান

11
gmdate("d H:i:s",1640467);

ফলাফল 19 23:41:07 হবে। এটি যখন স্বাভাবিক দিনের চেয়ে এক সেকেন্ড বেশি হয়, তখন এটি 1 দিনের জন্য দিনের মান বাড়িয়ে তুলছে। এই কারণেই এটি 19 দেখায় You আপনি আপনার প্রয়োজনের জন্য ফলাফলটি বিস্ফোরণ করতে পারেন এবং এটি ঠিক করতে পারেন।


আপনি এই কোডটিও এর মতো করে উন্নতি করতে পারেন: $uptime = gmdate("y m d H:i:s", 1640467); $uptimeDetail = explode(" ",$uptime); echo (string)($uptimeDetail[0]-70).' year(s) '.(string)($uptimeDetail[1]-1).' month(s) '.(string)($uptimeDetail[2]-1).' day(s) '.(string)$uptimeDetail[3];এটি আপনাকে বছর এবং মাসের তথ্যও দেবে।
ক্যানার SAGGIN

+1 দিনের ত্রুটি রোধ করতে সেকেন্ডের মধ্যে উত্স টাইমস্ট্যাম্প থেকে কেবল (24 * 60 * 60) বিয়োগ করুন।
andreszs

10

এখানে বেশ কয়েকটি খুব ভাল উত্তর রয়েছে তবে সেগুলির কোনওোটাই আমার প্রয়োজনীয়তা কভার করেনি। আমার প্রয়োজনীয় কিছু অতিরিক্ত বৈশিষ্ট্য যুক্ত করতে আমি গ্লাভিকের জবাবটি তৈরি করেছি;

  • জিরো প্রিন্ট করবেন না। সুতরাং "0 ঘন্টা, 5 মিনিট" এর পরিবর্তে "5 মিনিট"
  • বহুবচন ফর্মটি ডিফল্ট করার পরিবর্তে বহুবচনটি সঠিকভাবে পরিচালনা করুন।
  • ইউনিটগুলির একটি নির্দিষ্ট সংখ্যায় আউটপুট সীমিত করুন; সুতরাং "2 মাস, 2 দিন" পরিবর্তে "2 মাস, 2 দিন, 1 ঘন্টা, 45 মিনিট"

আপনি কোডটির একটি চলমান সংস্করণ দেখতে পাবেন here

function secondsToHumanReadable(int $seconds, int $requiredParts = null)
{
    $from     = new \DateTime('@0');
    $to       = new \DateTime("@$seconds");
    $interval = $from->diff($to);
    $str      = '';

    $parts = [
        'y' => 'year',
        'm' => 'month',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    ];

    $includedParts = 0;

    foreach ($parts as $key => $text) {
        if ($requiredParts && $includedParts >= $requiredParts) {
            break;
        }

        $currentPart = $interval->{$key};

        if (empty($currentPart)) {
            continue;
        }

        if (!empty($str)) {
            $str .= ', ';
        }

        $str .= sprintf('%d %s', $currentPart, $text);

        if ($currentPart > 1) {
            // handle plural
            $str .= 's';
        }

        $includedParts++;
    }

    return $str;
}

4
এটি আমাকে অনেক সাহায্য করেছে
মনোজকিরান.এ

আমি আপনার ভিত্তিতে
লারভেল

8

সংক্ষিপ্ত, সহজ, নির্ভরযোগ্য:

function secondsToDHMS($seconds) {
    $s = (int)$seconds;
    return sprintf('%d:%02d:%02d:%02d', $s/86400, $s/3600%24, $s/60%60, $s%60);
}

4
আরও উত্তর এই উত্তরটিতে দীর্ঘতর পথ যেতে পারে যেমন পূর্ণসংখ্যার ধ্রুবকগুলি কী উপস্থাপন করে এবং স্ট্রিং ফর্ম্যাটিং স্প্রিন্টফের সাথে কীভাবে কাজ করে।

4
আমি স্প্রিন্টফ করব ('% dd:% 02d:% 02dm:% 02dd', $ s / 86400, $ s / 3600% 24, $ s / 60% 60, $ s% 60); আরও বেশি হান্নান হতে হবে (উদা: 0d: 00 পূর্বাহ্ণ: 05 মি: 00 সে)। তবে সম্ভবত এখানে সেরা সমাধান।
রিকার্ডো মার্টিনস

6

সবচেয়ে সহজ পদ্ধতির মধ্যে এমন একটি পদ্ধতি তৈরি করা হবে যা ডেটটাইম থেকে একটি ডেটইন্টারওয়াল দেয়: বর্তমান সময়ের থেকে $ সেকেন্ডের মধ্যে আপেক্ষিক সময়ের চেয়ে আলাদা $ এখন আপনি চেইন এবং ফর্ম্যাট করতে পারেন। উদাহরণ স্বরূপ:-

public function toDateInterval($seconds) {
    return date_create('@' . (($now = time()) + $seconds))->diff(date_create('@' . $now));
}

এখন আপনার পদ্ধতি কলটি ডেটইন্টারভাল :: ফর্ম্যাটে চেইন করুন

echo $this->toDateInterval(1640467)->format('%a days %h hours %i minutes'));

ফলাফল:

18 days 23 hours 41 minutes

3

যদিও এটি বেশ পুরানো প্রশ্ন - কেউ এগুলি দরকারী (দ্রুত বলে লেখা হয় না) পেতে পারেন:

function d_h_m_s__string1($seconds)
{
    $ret = '';
    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = (int)($seconds / $divs[$d]);
        $r = $seconds % $divs[$d];
        $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
        $seconds = $r;
    }

    return $ret;
}

function d_h_m_s__string2($seconds)
{
    if ($seconds == 0) return '0s';

    $can_print = false; // to skip 0d, 0d0m ....
    $ret = '';
    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = (int)($seconds / $divs[$d]);
        $r = $seconds % $divs[$d];
        if ($q != 0) $can_print = true;
        if ($can_print) $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
        $seconds = $r;
    }

    return $ret;
}

function d_h_m_s__array($seconds)
{
    $ret = array();

    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = $seconds / $divs[$d];
        $r = $seconds % $divs[$d];
        $ret[substr('dhms', $d, 1)] = $q;

        $seconds = $r;
    }

    return $ret;
}

echo d_h_m_s__string1(0*86400+21*3600+57*60+13) . "\n";
echo d_h_m_s__string2(0*86400+21*3600+57*60+13) . "\n";

$ret = d_h_m_s__array(9*86400+21*3600+57*60+13);
printf("%dd%dh%dm%ds\n", $ret['d'], $ret['h'], $ret['m'], $ret['s']);

ফলাফল:

0d21h57m13s
21h57m13s
9d21h57m13s

3
function seconds_to_time($seconds){
     // extract hours
    $hours = floor($seconds / (60 * 60));

    // extract minutes
    $divisor_for_minutes = $seconds % (60 * 60);
    $minutes = floor($divisor_for_minutes / 60);

    // extract the remaining seconds
    $divisor_for_seconds = $divisor_for_minutes % 60;
    $seconds = ceil($divisor_for_seconds);

    //create string HH:MM:SS
    $ret = $hours.":".$minutes.":".$seconds;
    return($ret);
}

4
আপনার অনুপস্থিত দিনগুলি
স্যাম টুক

3
function convert($seconds){
$string = "";

$days = intval(intval($seconds) / (3600*24));
$hours = (intval($seconds) / 3600) % 24;
$minutes = (intval($seconds) / 60) % 60;
$seconds = (intval($seconds)) % 60;

if($days> 0){
    $string .= "$days days ";
}
if($hours > 0){
    $string .= "$hours hours ";
}
if($minutes > 0){
    $string .= "$minutes minutes ";
}
if ($seconds > 0){
    $string .= "$seconds seconds";
}

return $string;
}

echo convert(3744000);

2

সমাধান যা 0 টি মান বাদ দেয় এবং সঠিক একবচন / বহুবচন মান নির্ধারণ করে

use DateInterval;
use DateTime;

class TimeIntervalFormatter
{

    public static function fromSeconds($seconds)
    {
        $seconds = (int)$seconds;
        $dateTime = new DateTime();
        $dateTime->sub(new DateInterval("PT{$seconds}S"));
        $interval = (new DateTime())->diff($dateTime);
        $pieces = explode(' ', $interval->format('%y %m %d %h %i %s'));
        $intervals = ['year', 'month', 'day', 'hour', 'minute', 'second'];
        $result = [];
        foreach ($pieces as $i => $value) {
            if (!$value) {
                continue;
            }
            $periodName = $intervals[$i];
            if ($value > 1) {
                $periodName .= 's';
            }
            $result[] = "{$value} {$periodName}";
        }
        return implode(', ', $result);
    }
}

1

গ্লাভি'র দুর্দান্ত সমাধানের বর্ধিত সংস্করণ , পূর্ণসংখ্যার বৈধতা থাকা, 1 টির সমস্যা সমাধান করা, এবং বছর এবং মাসের জন্য অতিরিক্ত সমর্থন, আরও বেশি মানুষের বান্ধব হওয়ার পক্ষে কম্পিউটার কমবেশী বান্ধব হওয়ার ব্যয়ে:

<?php
function secondsToHumanReadable(/*int*/ $seconds)/*: string*/ {
    //if you dont need php5 support, just remove the is_int check and make the input argument type int.
    if(!\is_int($seconds)){
        throw new \InvalidArgumentException('Argument 1 passed to secondsToHumanReadable() must be of the type int, '.\gettype($seconds).' given');
    }
    $dtF = new \DateTime ( '@0' );
    $dtT = new \DateTime ( "@$seconds" );
    $ret = '';
    if ($seconds === 0) {
        // special case
        return '0 seconds';
    }
    $diff = $dtF->diff ( $dtT );
    foreach ( array (
            'y' => 'year',
            'm' => 'month',
            'd' => 'day',
            'h' => 'hour',
            'i' => 'minute',
            's' => 'second' 
    ) as $time => $timename ) {
        if ($diff->$time !== 0) {
            $ret .= $diff->$time . ' ' . $timename;
            if ($diff->$time !== 1 && $diff->$time !== -1 ) {
                $ret .= 's';
            }
            $ret .= ' ';
        }
    }
    return substr ( $ret, 0, - 1 );
}

var_dump(secondsToHumanReadable(1*60*60*2+1)); -> string(16) "2 hours 1 second"


1

আমার লেখা ইন্টারভাল ক্লাসটি ব্যবহার করা যেতে পারে। এটি বিপরীতেও ব্যবহার করা যেতে পারে।

composer require lubos/cakephp-interval

$Interval = new \Interval\Interval\Interval();

// output 2w 6h
echo $Interval->toHuman((2 * 5 * 8 + 6) * 3600);

// output 36000
echo $Interval->toSeconds('1d 2h');

এখানে আরও তথ্য https://github.com/LubosRemplik/ কেক পিএইচপি- আন্তঃকাল


1

সঙ্গে DateInterval :

$d1 = new DateTime();
$d2 = new DateTime();
$d2->add(new DateInterval('PT'.$timespan.'S'));

$interval = $d2->diff($d1);
echo $interval->format('%a days, %h hours, %i minutes and %s seconds');

// Or
echo sprintf('%d days, %d hours, %d minutes and %d seconds',
    $interval->days,
    $interval->h,
    $interval->i,
    $interval->s
);

// $interval->y => years
// $interval->m => months
// $interval->d => days
// $interval->h => hours
// $interval->i => minutes
// $interval->s => seconds
// $interval->days => total number of days

1

আমি জানি না যে এই উত্তরগুলির কয়েকটি হাস্যকরভাবে দীর্ঘ বা জটিল are এখানে ডেটটাইম ক্লাস ব্যবহার করা হচ্ছে । Radzserg এর উত্তর মত ধরনের। এটি কেবল প্রয়োজনীয় ইউনিটগুলি প্রদর্শন করবে এবং নেতিবাচক সময়ে 'পূর্ব' প্রত্যয়টি হবে ...

function calctime($seconds = 0) {

    $datetime1 = date_create("@0");
    $datetime2 = date_create("@$seconds");
    $interval = date_diff($datetime1, $datetime2);

    if ( $interval->y >= 1 ) $thetime[] = pluralize( $interval->y, 'year' );
    if ( $interval->m >= 1 ) $thetime[] = pluralize( $interval->m, 'month' );
    if ( $interval->d >= 1 ) $thetime[] = pluralize( $interval->d, 'day' );
    if ( $interval->h >= 1 ) $thetime[] = pluralize( $interval->h, 'hour' );
    if ( $interval->i >= 1 ) $thetime[] = pluralize( $interval->i, 'minute' );
    if ( $interval->s >= 1 ) $thetime[] = pluralize( $interval->s, 'second' );

    return isset($thetime) ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
}

function pluralize($count, $text) {
    return $count . ($count == 1 ? " $text" : " ${text}s");
}

// Examples:
//    -86400 = 1 day ago
//     12345 = 3 hours 25 minutes 45 seconds
// 987654321 = 31 years 3 months 18 days 4 hours 25 minutes 21 seconds

সম্পাদনা: আপনি যদি কম ভেরিয়েবল / স্পেস ব্যবহার করার জন্য উপরের উদাহরণটি ঘন করতে চান (স্বচ্ছতার ব্যয়ে), এখানে একটি বিকল্প সংস্করণ যা একই জিনিসটি করে:

function calctime($seconds = 0) {
    $interval = date_diff(date_create("@0"),date_create("@$seconds"));

    foreach (array('y'=>'year','m'=>'month','d'=>'day','h'=>'hour','i'=>'minute','s'=>'second') as $format=>$desc) {
        if ($interval->$format >= 1) $thetime[] = $interval->$format . ($interval->$format == 1 ? " $desc" : " {$desc}s");
    }

    return isset($thetime) ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
}

আপনি 0 সেকেন্ডের থেকে রক্ষা করতে ক্যালকটাইম ফাংশনে সুরক্ষা যুক্ত করতে চাইতে পারেন। বর্তমান কোডটি একটি ত্রুটি ছুঁড়েছে। মোড়ানো $thetimeবিনিময়ে, যেমন,isset($thetime)
স্টারগেজিং পোকায় আক্রান্ত

পরামর্শের জন্য ধন্যবাদ, আপনি ত্রুটি সম্পর্কে সঠিক (আমি বিশ্বাস করতে পারি না যে আমি এটি মিস করেছি)। আমি সেই অনুযায়ী কোড আপডেট করেছি!
জেসন

0

এখানে কয়েকটি কোড যা আমি দুটি তারিখের মধ্যে সময়কাল পাওয়ার উদ্দেশ্যে ব্যবহার করতে চাই। এটি দুটি তারিখ গ্রহণ করে এবং আপনাকে একটি সুন্দর বাক্য কাঠামোগত জবাব দেয়।

এটি এখানে পাওয়া কোডের কিছুটা পরিবর্তিত সংস্করণ ।

<?php

function dateDiff($time1, $time2, $precision = 6, $offset = false) {

    // If not numeric then convert texts to unix timestamps

    if (!is_int($time1)) {
            $time1 = strtotime($time1);
    }

    if (!is_int($time2)) {
            if (!$offset) {
                    $time2 = strtotime($time2);
            }
            else {
                    $time2 = strtotime($time2) - $offset;
            }
    }

    // If time1 is bigger than time2
    // Then swap time1 and time2

    if ($time1 > $time2) {
            $ttime = $time1;
            $time1 = $time2;
            $time2 = $ttime;
    }

    // Set up intervals and diffs arrays

    $intervals = array(
            'year',
            'month',
            'day',
            'hour',
            'minute',
            'second'
    );
    $diffs = array();

    // Loop thru all intervals

    foreach($intervals as $interval) {

            // Create temp time from time1 and interval

            $ttime = strtotime('+1 ' . $interval, $time1);

            // Set initial values

            $add = 1;
            $looped = 0;

            // Loop until temp time is smaller than time2

            while ($time2 >= $ttime) {

                    // Create new temp time from time1 and interval

                    $add++;
                    $ttime = strtotime("+" . $add . " " . $interval, $time1);
                    $looped++;
            }

            $time1 = strtotime("+" . $looped . " " . $interval, $time1);
            $diffs[$interval] = $looped;
    }

    $count = 0;
    $times = array();

    // Loop thru all diffs

    foreach($diffs as $interval => $value) {

            // Break if we have needed precission

            if ($count >= $precision) {
                    break;
            }

            // Add value and interval
            // if value is bigger than 0

            if ($value > 0) {

                    // Add s if value is not 1

                    if ($value != 1) {
                            $interval.= "s";
                    }

                    // Add value and interval to times array

                    $times[] = $value . " " . $interval;
                    $count++;
            }
    }

    if (!empty($times)) {

            // Return string with times

            return implode(", ", $times);
    }
    else {

            // Return 0 Seconds

    }

    return '0 Seconds';
}

সূত্র: https://gist.github.com/ozh/8169202


0

সব এক সমাধানে। জিরো সহ কোনও ইউনিট দেয় না। আপনার নির্দিষ্ট সংখ্যক ইউনিট তৈরি করবে (ডিফল্টরূপে 3)। বেশ দীর্ঘ, সম্ভবত খুব মার্জিত না। সংজ্ঞাগুলি alচ্ছিক, তবে কোনও বড় প্রকল্পে এটি কার্যকর হতে পারে।

define('OneMonth', 2592000);
define('OneWeek', 604800);  
define('OneDay', 86400);
define('OneHour', 3600);    
define('OneMinute', 60);

function SecondsToTime($seconds, $num_units=3) {        
    $time_descr = array(
                "months" => floor($seconds / OneMonth),
                "weeks" => floor(($seconds%OneMonth) / OneWeek),
                "days" => floor(($seconds%OneWeek) / OneDay),
                "hours" => floor(($seconds%OneDay) / OneHour),
                "mins" => floor(($seconds%OneHour) / OneMinute),
                "secs" => floor($seconds%OneMinute),
                );  

    $res = "";
    $counter = 0;

    foreach ($time_descr as $k => $v) {
        if ($v) {
            $res.=$v." ".$k;
            $counter++;
            if($counter>=$num_units)
                break;
            elseif($counter)
                $res.=", ";             
        }
    }   
    return $res;
}

নিচে ভোট দিতে নির্দ্বিধায়, কিন্তু আপনার কোড এ চেষ্টা নিশ্চিত হন। এটি কেবল আপনার যা প্রয়োজন তা হতে পারে।


0

কোনও সমাধান-ব্যতীত আমি (পিএইচপি শিখার সময় ফিরে এসেছি) এর সমাধানটি:

$days = (int)($uptime/86400); //1day = 86400seconds
$rdays = (uptime-($days*86400)); 
//seconds remaining after uptime was converted into days
$hours = (int)($rdays/3600);//1hour = 3600seconds,converting remaining seconds into hours
$rhours = ($rdays-($hours*3600));
//seconds remaining after $rdays was converted into hours
$minutes = (int)($rhours/60); // 1minute = 60seconds, converting remaining seconds into minutes
echo "$days:$hours:$minutes";

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


0
a=int(input("Enter your number by seconds "))
d=a//(24*3600)   #Days
h=a//(60*60)%24  #hours
m=a//60%60       #minutes
s=a%60           #seconds
print("Days ",d,"hours ",h,"minutes ",m,"seconds ",s)

0

নেতিবাচক মান আসার পরে আমি এটির একটি কার্যকর কোড সম্পাদনা করছি। floor()মানটি নেতিবাচক হলে ফাংশন সঠিক গণনা দিচ্ছে না। সুতরাং আমাদের abs()এটি ফাংশনে ব্যবহারের আগে ফাংশনটি ব্যবহার করা দরকার floor()$inputSecondsচলক বর্তমান সময়ের স্ট্যাম্প এবং প্রয়োজনীয় তারিখের মধ্যে পার্থক্য হতে পারে।

/** 
 * Convert number of seconds into hours, minutes and seconds 
 * and return an array containing those values 
 * 
 * @param integer $inputSeconds Number of seconds to parse 
 * @return array 
 */ 

function secondsToTime($inputSeconds) {

    $secondsInAMinute = 60;
    $secondsInAnHour  = 60 * $secondsInAMinute;
    $secondsInADay    = 24 * $secondsInAnHour;

    // extract days
    $days = abs($inputSeconds / $secondsInADay);
    $days = floor($days);

    // extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = abs($hourSeconds / $secondsInAnHour);
    $hours = floor($hours);

    // extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = abs($minuteSeconds / $secondsInAMinute);
    $minutes = floor($minutes);

    // extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = abs($remainingSeconds);
    $seconds = ceil($remainingSeconds);

    // return the final array
    $obj = array(
        'd' => (int) $days,
        'h' => (int) $hours,
        'm' => (int) $minutes,
        's' => (int) $seconds,
    );
    return $obj;
}

0

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

function secondsToTime($seconds)
{
    $dtF = new \DateTime('@0');
    $dtT = new \DateTime("@$seconds");
    $dateInterval = $dtF->diff($dtT);
    $days_t = 'day';
    $hours_t = 'hour';
    $minutes_t = 'minute';
    $seconds_t = 'second';
    if ((int)$dateInterval->d > 1) {
        $days_t = 'days';
    }
    if ((int)$dateInterval->h > 1) {
        $hours_t = 'hours';
    }
    if ((int)$dateInterval->i > 1) {
        $minutes_t = 'minutes';
    }
    if ((int)$dateInterval->s > 1) {
        $seconds_t = 'seconds';
    }


    if ((int)$dateInterval->d > 0) {
        if ((int)$dateInterval->d > 1 || (int)$dateInterval->h === 0) {
            return $dateInterval->format("%a $days_t");
        } else {
            return $dateInterval->format("%a $days_t, %h $hours_t");
        }
    } else if ((int)$dateInterval->h > 0) {
        if ((int)$dateInterval->h > 1 || (int)$dateInterval->i === 0) {
            return $dateInterval->format("%h $hours_t");
        } else {
            return $dateInterval->format("%h $hours_t, %i $minutes_t");
        }
    } else if ((int)$dateInterval->i > 0) {
        if ((int)$dateInterval->i > 1 || (int)$dateInterval->s === 0) {
            return $dateInterval->format("%i $minutes_t");
        } else {
            return $dateInterval->format("%i $minutes_t, %s $seconds_t");
        }
    } else {
        return $dateInterval->format("%s $seconds_t");
    }

}
php > echo secondsToTime(60);
1 minute
php > echo secondsToTime(61);
1 minute, 1 second
php > echo secondsToTime(120);
2 minutes
php > echo secondsToTime(121);
2 minutes
php > echo secondsToTime(2000);
33 minutes
php > echo secondsToTime(4000);
1 hour, 6 minutes
php > echo secondsToTime(4001);
1 hour, 6 minutes
php > echo secondsToTime(40001);
11 hours
php > echo secondsToTime(400000);
4 days

-1
foreach ($email as $temp => $value) {
    $dat = strtotime($value['subscription_expiration']); //$value come from mysql database
//$email is an array from mysqli_query()
    $date = strtotime(date('Y-m-d'));

    $_SESSION['expiry'] = (((($dat - $date)/60)/60)/24)." Days Left";
//you will get the difference from current date in days.
}

$ মান ডাটাবেস থেকে আসে। এই কোডটি কোডইনিটারে রয়েছে। ESS SESSION ব্যবহারকারীর সাবস্ক্রিপশন সংরক্ষণ করার জন্য ব্যবহৃত হয়। এটা বাধ্যতামূলক. আমি এটি আমার ক্ষেত্রে ব্যবহার করেছি, আপনি যা চান তা ব্যবহার করতে পারেন।


4
আপনি কি আপনার কোডটিতে আরও কিছু ব্যাখ্যা যুক্ত করতে পারেন? কোথা $valueথেকে আসে? কেন আপনি একটি অধিবেশন প্রবর্তন করতে আগ্রহী? এটি কীভাবে সেকেন্ড, মিনিট এবং ঘন্টার জন্য সঠিক স্ট্রিংটি ফেরায়?
নিকো হাজে

@ নিকোহেস উত্তর আপডেট হয়েছে।
তৈয়ব হায়াত

-2

এটি আপনার প্রশ্নের সাথে সম্পর্কিত অন্যটি থেকে তারিখটি বাদ দেওয়ার জন্য আমি অতীতে ব্যবহৃত একটি ফাংশন, আমার প্রিন্সিপাল একটি পণ্যটির মেয়াদ শেষ না হওয়া অবধি কত দিন, ঘন্টা মিনিট এবং সেকেন্ড বাকি ছিল তা পান:

$expirationDate = strtotime("2015-01-12 20:08:23");
$toDay = strtotime(date('Y-m-d H:i:s'));
$difference = abs($toDay - $expirationDate);
$days = floor($difference / 86400);
$hours = floor(($difference - $days * 86400) / 3600);
$minutes = floor(($difference - $days * 86400 - $hours * 3600) / 60);
$seconds = floor($difference - $days * 86400 - $hours * 3600 - $minutes * 60);

echo "{$days} days {$hours} hours {$minutes} minutes {$seconds} seconds";

কিভাবে সপ্তাহের সংখ্যা পেতে? উদাহরণস্বরূপ: 5 সেকেন্ড, 1 ঘন্টা, 3 দিন, 2 সপ্তাহ, 1 মাস
স্ট্যাকওভারফ্লো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.