Saniyeleri günlere, saate, dakikalara ve saniyelere dönüştürün


92

$uptimeSaniye olan bir değişkeni günlere, saate, dakikalara ve saniyelere dönüştürmek istiyorum.

Misal:

$uptime = 1640467;

Sonuç şöyle olmalıdır:

18 days 23 hours 41 minutes

Yanıtlar:


218

Bu, ile başarılabilir DateTime sınıfla

İşlev:

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

Kullanım:

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

demo


@ Glavić Buna haftalık ve aylık desteği nasıl ekleyebilirim?
socca1157

2
İşleve doğrulama eklediğinizden emin olun. eğer (boş ($ saniye)) {dönüş yanlış;}
bir kodlayıcı

4
@acoder: Bence bu işlev doğrulama ile ilgilenmemeli; doğrulama, işlev çağrısından önce ayarlanmalıdır. Yine de, doğrulamanız hala yanlış, çünkü örneğin alfabeyi de geçecek.
Glavić

2
@Yapıcıya bir argüman olarak iletildiğinde ne anlama geliyor DateTime?
Ivanka Todorova

4
@IvankaTodorova: @Unix zaman damgasından sonraki değer .
Glavić

46

Bu, günleri içerecek şekilde yeniden yazılan işlevdir. Kodun anlaşılmasını kolaylaştırmak için değişken adlarını da değiştirdim ...

/** 
 * 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;
}

Kaynak: CodeAid () - http://codeaid.net/php/convert-seconds-to-hours-minutes-and-seconds-(php)


Kaynak eklemek güzel olurdu
Martin.

bu işleve günler eklemek için yeterince nazik olur musunuz?
knittledan

@knittledan, öyle görünmüyor :)
AO_

1
@ hsmoore.com Devam ettim ve bunu $ gün = kat ($ saniye / (60 * 60 * 24)); // saatleri çıkar $ divisor_for_hours = $ saniye% (60 * 60 * 24); $ saat = kat ($ bölen_saatler / (60 * 60));
knittledan

1
Bu günlerce beklendiği gibi çalışmıyor. $ Saatten ($ gün * 24) çıkarmanız gerekir, aksi takdirde günlerdeki saatler $ gün ve $ saat olarak iki kez sayılır. örneğin 100000 girin => 1 gün ve 27 saat. Bu 1 gün 3 saat olmalıdır.
finiteloop

32

Julian Moreno'nun cevabına göre, ancak yanıtı bir dizge (dizi değil) olarak verecek şekilde değiştirildi, yalnızca gereken zaman aralıklarını dahil edin ve çoğulu varsaymayın.

Bu ve en yüksek oyu alan cevap arasındaki fark şudur:

İçin 259264saniye, bu kod verecek

3 gün, 1 dakika, 4 saniye

İçin 259264saniye, en yüksek (Glavić tarafından) cevabını olarak verecekti

3 gün, 0 saat , 1 dakika ve 4 saniye

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

Umarım bu birine yardımcı olur.


1
Bunu tercih ediyorum çünkü "s" yi "1 saat" ten kaldırıyor ve benim durumumda günleri kaldırmak ve sadece büyük bir saat sayısına sahip olmak istedim ve bu yöntemin <3 'e adapte edilmesi çok kolaydı.
Ryan S

1
Çok güzel Luke, kompakt ve temiz tutuyor!
VoidZA

21

Burada, birkaç saniyeyi büyük miktarlarda saniyeler için ay sayısı dahil olmak üzere insan tarafından okunabilir bir dizeye dönüştüren basit bir 8 satırlı PHP işlevidir:

PHP işlevi saniye2human ()

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
Basit ama verimli. Yine de 'Aylar' kısmını beğenmedim.
Francisco Presencia

1
Cevabınıza kod eklemelisiniz, başka bir sayfaya bağlantı vermemelisiniz. Bağlandığınız web sitesinin yarın hala orada olacağından emin olmanın bir yolu yok
Zachary Weixelbaum

Bize basit çözümler sunma çabanız için çok teşekkür ederim
Adnan

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

Sonuç 19 23:41:07 olacak. Normal günden sadece bir saniye fazla olduğunda 1 gün boyunca gün değerini artırıyor. Bu yüzden 19'u gösteriyor. İhtiyaçlarınız için sonucu patlatıp bunu düzeltebilirsiniz.


Bu kodu şu şekilde de geliştirebilirsiniz: $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];Bu aynı zamanda size yıl ve ay bilgileri de verecektir.
Caner SAYGIN

+1 gün hatasını önlemek için kaynak zaman damgasından saniye cinsinden çıkarın (24 * 60 * 60).
andreszs

10

Burada çok güzel cevaplar var ama hiçbiri ihtiyaçlarımı karşılamadı. İhtiyacım olan bazı ekstra özellikleri eklemek için Glavic'in cevabını temel aldım;

  • Sıfır basmayın. Yani "0 saat, 5 dakika" yerine "5 dakika"
  • Çoğul biçimi varsayılan olarak kullanmak yerine çoğulları doğru şekilde ele alın.
  • Çıkışı belirli bir birim sayısıyla sınırlayın; Yani "2 ay, 2 gün, 1 saat, 45 dakika" yerine "2 ay, 2 gün"

Kodun çalışan bir sürümünü görebilirsiniz 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
bana çok yardımcı oldu
Manojkiran. A

senin laravel yoluna göre fonksiyonu oluşturacağım
Manojkiran. A

8

Kısa, basit, güvenilir:

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

3
Tamsayı sabitlerinin neyi temsil ettiği ve dize biçimlendirmesinin sprintf ile nasıl çalıştığı gibi bu yanıtta daha fazla açıklama uzun bir yol kat edecektir.

1
Sprintf yapardım ('% dd:% 02dh:% 02dm:% 02ds', $ s / 86400, $ s / 3600% 24, $ s / 60% 60, $ s% 60); daha da humnan olmak için (ör: 0d: 00h: 05m: 00s). Ama muhtemelen buradaki en iyi çözüm.
Ricardo Martins

6

En basit yaklaşım, göreli zamanın DateTime :: diff değerinden, $ şimdi geçerli saatten $ saniye cinsinden bir DateInterval döndüren bir yöntem oluşturmaktır; bunu daha sonra zincirleyip biçimlendirebilirsiniz. Örneğin:-

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

Şimdi metod çağrınızı DateInterval :: format'a zincirleyin

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

Sonuç:

18 days 23 hours 41 minutes

3

Oldukça eski bir soru olmasına rağmen - bunları yararlı bulabilir (hızlı olması için yazılmamış):

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']);

sonuç:

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
Eksik günler
Sam Tuke

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 değerleri hariç tutması ve doğru tekil / çoğul değerleri ayarlaması gereken çözüm

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ć'in mükemmel çözümünün genişletilmiş bir versiyonu, tamsayı doğrulama, 1 s problemini çözme ve daha insan dostu olma adına daha az bilgisayar ayrıştırma dostu olma pahasına yıllar ve aylarca ek destek:

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

Yazdığım aralık sınıfı kullanılabilir. Bunun tersi de kullanılabilir.

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

Daha fazla bilgi burada https://github.com/LubosRemplik/CakePHP-Interval


1

İle 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

Bu cevaplardan bazılarının neden gülünç derecede uzun veya karmaşık olduğunu bilmiyorum. İşte DateTime Sınıfını kullanan biri . Radzserg'in cevabına benzer. Bu yalnızca gerekli birimleri gösterecek ve negatif zamanlar 'önce' son ekine sahip olacak ...

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

DÜZENLEME: Yukarıdaki örneği daha az değişken / alan kullanmak için (okunaklılık pahasına) yoğunlaştırmak istiyorsanız, işte aynı şeyi yapan alternatif bir sürüm:

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 saniyeye karşı koruma sağlamak için calctime işlevine güvenlik eklemek isteyebilirsiniz. Mevcut kod bir hata atıyor. İadeyi sarın $thetime, örneğin,isset($thetime)
Stargazing Worm

Öneriniz için teşekkürler, hata konusunda haklısınız (Bunu kaçırdığıma inanamıyorum). Kodu buna göre güncelledim!
Jason

0

İki tarih arasındaki süreyi öğrenmek amacıyla kullanmak istediğim bazı kodlar. İki tarihi kabul eder ve size güzel bir cümle yapılandırılmış cevap verir.

Bu, bulunan kodun biraz değiştirilmiş bir sürümüdür burada .

<?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';
}

Kaynak: https://gist.github.com/ozh/8169202


0

Hepsi bir arada çözüm. Sıfırlı birim vermez. Yalnızca belirttiğiniz sayıda birim üretecektir (varsayılan olarak 3). Oldukça uzun, belki çok zarif değil. Tanımlar isteğe bağlıdır, ancak büyük bir projede kullanışlı olabilir.

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

Olumsuz oy kullanmaktan çekinmeyin, ancak kodunuzda denediğinizden emin olun. Sadece ihtiyacın olan şey olabilir.


0

Bunun için kullandığım çözüm (PHP'yi öğrenirken geçen günlere) herhangi bir işlev olmadan:

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

Bu eski bir soru olmasına rağmen, bununla karşılaşan yeni öğrenciler bu cevabı faydalı bulabilir.


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

Negatif değer geldiğinde iyi çalışması için kodlardan birini düzenliyorum. floor()değer negatif olduğunda fonksiyon doğru sayımı vermiyor. Bu yüzden abs()fonksiyonda kullanmadan önce fonksiyonu kullanmamız gerekiyor floor(). $inputSecondsdeğişken, geçerli zaman damgası ile gerekli tarih arasındaki fark olabilir.

/** 
 * 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ć'in cevabının bir varyasyonu - bu, daha kısa sonuçlar için baştaki sıfırları gizler ve çoğulları doğru yerlerde kullanır. Ayrıca gereksiz hassasiyeti de ortadan kaldırır (örneğin, zaman farkı 2 saatin üzerindeyse, muhtemelen kaç dakika veya saniye umursamıyorsunuz).

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

$ değer Veritabanından gelir. Bu kod Codeigniter'da. $ SESSION, kullanıcı aboneliklerini saklamak için kullanılır. zorunludur. Benim durumumda kullandım, ne istersen kullanabilirsin.


1
Kodunuza biraz daha açıklama ekleyebilir misiniz? Nereden $valuegeliyor? Neden bir seans sunmayı düşünüyorsunuz? Bu saniyeler, dakikalar ve saatler için doğru dizeyi nasıl döndürür?
Nico Haase

@NicoHaase yanıtı Güncellendi.
Tayyab Hayat

-2

Bu, geçmişte sorunuzla ilgili bir tarihi diğerinden çıkarmak için kullandığım bir işlev, prensibim bir ürünün kullanım süresi dolana kadar kaç gün, saat dakika ve saniye kaldığını öğrenmekti:

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

ayrıca hafta sayısı nasıl alınır? örnek: 5 saniye, 1 saat, 3 gün, 2 hafta, 1 ay
Stackoverflow
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.