सेकंड को दिन, घंटे, मिनट और सेकंड में बदलें


92

मैं एक चर को बदलना चाहता हूं $uptime, जो सेकंड है, दिन, घंटे, मिनट और सेकंड में।

उदाहरण:

$uptime = 1640467;

परिणाम होना चाहिए:

18 days 23 hours 41 minutes

जवाबों:


214

इसे 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


@ Glavić मैं इसमें सप्ताह और महीने के लिए समर्थन कैसे जोड़ूंगा?
socca1157

2
फ़ंक्शन में सत्यापन जोड़ना सुनिश्चित करें। if (खाली ($ सेकंड)) {झूठा वापस लौटना;}
एक कोडर

4
@acoder: मुझे लगता है कि इस फ़ंक्शन को सत्यापन का ध्यान नहीं रखना चाहिए; फ़ंक्शन कॉल से पहले सत्यापन सेटअप किया जाना चाहिए। फिर भी, आपका सत्यापन अभी भी गलत है, क्योंकि उदाहरण के लिए यह वर्णमाला भी पारित करेगा।
Glavić

2
निर्माणकर्ता के @तर्क के रूप में पारित होने का क्या मतलब है DateTime?
इवांका टोडोरोवा

4
@IvankaTodorova: के बाद @का मूल्य यूनिक्स टाइमस्टैम्प है।
Glavić

44

यह दिनों को शामिल करने के लिए फिर से लिखा गया कार्य है। मैंने कोड को समझने में आसान बनाने के लिए चर नाम भी बदले ...

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


स्रोत
मार्टिन

क्या आप इस फंक्शन में दिनों को जोड़ना चाहेंगे?
knittledan

@ ाकिन्तलेडन, ऐसा प्रतीत नहीं होता है :)
AO_

1
@ hsmoore.com मैं आगे गया और यह $ दिन = मंजिल ($ सेकंड / (60 * 60 * 24)) लगा; // निकालने के घंटे $ divisor_for_hours = $ सेकंड% (60 * 60 * 24); $ घंटे = मंजिल ($ divisor_for_hours / (60 * 60));
knittledan

1
यह दिनों की अपेक्षा काम नहीं करता है। आपको $ घंटे से ($ दिन * 24) घटाना होगा, वरना दिनों में घंटों की गणना $ दिनों और $ घंटे में दोगुनी हो जाएगी। जैसे इनपुट 100000 => 1 दिन और 27 घंटे। यह 1 दिन और 3 घंटे होना चाहिए।
1948 में फ़िनिटेलिओप

30

जूलियन मोरेनो के जवाब के आधार पर, लेकिन एक स्ट्रिंग के रूप में प्रतिक्रिया देने के लिए बदल गया (एक सरणी नहीं), केवल आवश्यक समय अंतराल को शामिल करें और बहुवचन को न मानें।

इस और सबसे ज्यादा वोट दिए गए उत्तर के बीच का अंतर है:

के लिए 259264सेकंड, इस कोड को देना होगा

3 दिन, 1 मिनट, 4 सेकंड

के लिए 259264सेकंड, उच्चतम (Glavić से) जवाब मतदान देना होगा

3 दिन, 0 घंटे , 1 मिनट एस और 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);
}

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


1
मैं इसे पसंद करता हूं क्योंकि यह "1 घंटे" से "एस" को हटा देता है, और, मेरे मामले में, मैं दिनों को निकालना चाहता था और बस एक बड़ी घंटे की गिनती है, और यह विधि उस <3 के लिए अनुकूल करना बहुत आसान था।
रयान एस

1
बहुत अच्छा ल्यूक, यह कॉम्पैक्ट और साफ रखते हुए!
विदेह १५

19

यह एक सरल 8-लाइन PHP फ़ंक्शन है जो बड़ी मात्रा में सेकंड के लिए महीनों की संख्या सहित एक मानव पठनीय स्ट्रिंग में कई सेकंड को परिवर्तित करता है:

PHP फ़ंक्शन सेकंड 2human ()

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

2
सरल अभी तक कुशल। हालाँकि मुझे 'मंथ' बिट पसंद नहीं था।
फ्रांसिस्को प्रेसेनिया

1
आपको अपने उत्तर में कोड शामिल करना चाहिए, दूसरे पृष्ठ से लिंक नहीं करना चाहिए। यह पता लगाने का कोई तरीका नहीं है कि जिस वेबसाइट को आप लिंक कर रहे हैं वह कल भी रहेगी
Zachary Weixelbaum

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

परिणाम 19 23:41:07 होगा। जब यह सामान्य दिन से सिर्फ एक सेकंड अधिक है, तो यह 1 दिन के लिए दिन के मूल्य में वृद्धि कर रहा है। यही कारण है कि यह 19 दिखाता है। आप अपनी आवश्यकताओं के लिए परिणाम को विस्फोट कर सकते हैं और इसे ठीक कर सकते हैं।


आप इस कोड को इस तरह भी सुधार सकते हैं: $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];यह आपको साल और महीने का सुझाव भी देगा।
कैनर SAYGIN

+1 दिन की त्रुटि को रोकने के लिए सेकंड में स्रोत टाइमस्टैम्प से बस (24 * 60 * 60) स्थानापन्न करें।
andreszs

9

यहाँ कुछ बहुत अच्छे जवाब हैं, लेकिन उनमें से कोई भी मेरी जरूरतों को पूरा नहीं करता है। मैंने कुछ अतिरिक्त विशेषताओं को जोड़ने के लिए Glavic के उत्तर पर निर्माण किया, जिनकी मुझे आवश्यकता थी;

  • शून्य मुद्रित न करें। तो "0 मिनट" के बजाय "0 घंटे, 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;
}

1
इससे मुझे बहुत मदद मिली
मनोजकिरण

मैं
लार्वा

8

लघु, सरल, विश्वसनीय:

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

3
आगे की व्याख्या इस उत्तर में एक लंबा रास्ता तय करेगी, जैसे कि पूर्णांक स्थिरांक क्या दर्शाते हैं और स्ट्रिंग स्वरूपण स्प्रिंट के साथ कैसे काम करता है।

1
मैं स्प्रिंटफ ('% dd:% 02dh:% 02dm:% 02ds', $ s / 86400, $ s / 3600% 24, $ s / 60% 60, $ s% 60); बस और भी अधिक मानवीय होने के लिए (उदा: 0d: 00h: 05m: 00s)। लेकिन शायद यहाँ सबसे अच्छा समाधान है।
रिकार्डो मार्टिंस

6

सबसे सरल तरीका एक तरीका बनाना होगा जो DateTime से एक DateInterval देता है :: वर्तमान समय से $ सेकंड में सापेक्ष समय का अंतर $ अब जो आप तब चेन और प्रारूप कर सकते हैं। उदाहरण के लिए:-

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

अब अपने तरीके को DateInterval :: फॉर्मेट में कॉल करें

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

1
आपको दिन याद आ रहे हैं
सैम टुके

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

अधिक मानवीय अनुकूल होने के पक्ष में कम कंप्यूटर पार्सिंग फ्रेंडली होने की कीमत पर, Glavić के उत्कृष्ट समाधान का एक विस्तारित संस्करण , पूर्णांक सत्यापन होने, 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/CakePHP-Interval


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

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 डिफ़ॉल्ट रूप से)। काफी लंबा, शायद बहुत सुरुचिपूर्ण नहीं। परिभाषित वैकल्पिक हैं, लेकिन एक बड़ी परियोजना में काम आ सकता है।

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

@ Glavić के उत्तर पर एक भिन्नता - यह छोटे परिणामों के लिए अग्रणी शून्य छुपाता है और सही स्थानों पर बहुवचन का उपयोग करता है। यह अनावश्यक परिशुद्धता को भी हटा देता है (उदाहरण के लिए यदि समय का अंतर 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

0

मुझे नहीं पता कि इनमें से कुछ उत्तर हास्यास्पद या लंबे क्यों हैं। यहाँ DateTime Class का उपयोग कर एक है । रेडजर्सग के उत्तर के समान। यह केवल आवश्यक इकाइयों को प्रदर्शित करेगा, और नकारात्मक समय में 'पहले' प्रत्यय होगा ...

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)
Stargazing Worm

सुझाव के लिए धन्यवाद, आप त्रुटि के बारे में सही हैं (मुझे विश्वास नहीं हो सकता है कि मैं चूक गया था)। मैंने तदनुसार कोड अपडेट किया है!
जेसन

-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.
}

$ मूल्य डेटाबेस से आते हैं। यह कोड Codeigniter में है। $ SESSION का उपयोग उपयोगकर्ता सदस्यता के भंडारण के लिए किया जाता है। यह जरूरी है। मैंने इसे अपने मामले में इस्तेमाल किया, आप जो चाहें उपयोग कर सकते हैं।


1
क्या आप अपने कोड में कुछ और स्पष्टीकरण जोड़ सकते हैं? कहाँ $valueसे आता है? एक सत्र शुरू करने के लिए आप क्यों चिंतित थे? यह सेकंड, मिनट और घंटे के लिए उचित स्ट्रिंग कैसे लौटाता है?
निको हसे

@NicoHaase उत्तर अपडेट किया गया।
तय्यब हयात

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