แปลงวินาทีเป็นวันชั่วโมงนาทีและวินาที


92

ฉันต้องการแปลงตัวแปร$uptimeซึ่งเป็นวินาทีเป็นวันชั่วโมงนาทีและวินาที

ตัวอย่าง:

$uptime = 1640467;

ผลลัพธ์ควรเป็น:

18 days 23 hours 41 minutes

คำตอบ:


218

สิ่งนี้สามารถทำได้ด้วยDateTimeชั้นเรียน

ฟังก์ชัน:

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

ใช้:

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

demo


@ Glavićฉันจะเพิ่มการสนับสนุนสำหรับสัปดาห์และเดือนได้อย่างไร
socca1157

2
อย่าลืมเพิ่มการตรวจสอบความถูกต้องให้กับฟังก์ชัน if (empty ($ seconds)) {return false;}
coder

4
@acoder: ฉันคิดว่าฟังก์ชันนี้ไม่ควรดูแลการตรวจสอบความถูกต้อง ควรตั้งค่าการตรวจสอบความถูกต้องก่อนเรียกใช้ฟังก์ชัน อย่างไรก็ตามการตรวจสอบความถูกต้องของคุณยังคงไม่ถูกต้องเพราะตัวอย่างเช่นมันจะผ่านตัวอักษร
Glavić

2
อะไรคือความ@หมายเมื่อส่งผ่านเป็นอาร์กิวเมนต์ให้กับตัวDateTimeสร้าง?
Ivanka Todorova

4
@IvankaTodorova: ค่าหลัง@คือการประทับเวลา Unix
Glavić

46

นี่คือฟังก์ชันที่เขียนใหม่เพื่อรวมวัน ฉันยังเปลี่ยนชื่อตัวแปรเพื่อให้เข้าใจรหัสได้ง่ายขึ้น ...

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

ที่มา: CodeAid () - http://codeaid.net/php/convert-seconds-to-hours-minutes-and-seconds-(php)


จะเป็นการดีที่จะรวมแหล่งที่มา
มาร์ติน

คุณจะใจดีพอที่จะเพิ่มวันให้กับฟังก์ชันนี้หรือไม่?
knittledan

@knittledan ไม่ปรากฏ :)
AO_

1
@ hsmoore.com ฉันไปข้างหน้าและคิดออก $ days = floor ($ seconds / (60 * 60 * 24)) // แยกชั่วโมง $ divisor_for_hours = $ seconds% (60 * 60 * 24); $ ชั่วโมง = ชั้น ($ divisor_for_hours / (60 * 60));
knittledan

1
ไม่ได้ผลตามที่คาดไว้เป็นเวลาหลายวัน คุณต้องลบ ($ days * 24) จาก $ hours มิฉะนั้นชั่วโมงในวันนั้นจะถูกนับเป็นสองเท่าใน $ วันและ $ ชั่วโมง เช่นอินพุต 100000 => 1 วัน 27 ชั่วโมง ควรเป็น 1 วัน 3 ชั่วโมง
finiteloop

32

จากคำตอบของ Julian Moreno แต่เปลี่ยนเป็นการตอบสนองเป็นสตริง (ไม่ใช่อาร์เรย์) รวมเฉพาะช่วงเวลาที่ต้องการและไม่ถือว่าเป็นพหูพจน์

ความแตกต่างระหว่างคำตอบนี้กับคำตอบที่ได้รับการโหวตสูงสุดคือ:

ไม่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
ฉันชอบอันนี้เพราะมันเอา "s" ออกจาก "1 ชั่วโมง" และในกรณีของฉันฉันต้องการลบวันและมีจำนวนชั่วโมงมากและวิธีนี้ก็ปรับให้เข้ากับ <3 ได้ง่ายมาก
Ryan S

1
ลุคที่ดีมากทำให้กระชับและสะอาด!
VoidZA

21

นี่คือฟังก์ชั่น PHP 8 บรรทัดง่ายๆที่แปลงจำนวนวินาทีเป็นสตริงที่มนุษย์อ่านได้รวมถึงจำนวนเดือนสำหรับวินาทีจำนวนมาก:

ฟังก์ชัน PHP seconds2human ()

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
เรียบง่าย แต่มีประสิทธิภาพ แม้ว่าฉันจะไม่ชอบบิต 'เดือน'
Francisco Presencia

1
คุณควรใส่รหัสในคำตอบของคุณไม่ใช่ลิงก์ไปยังหน้าอื่น ไม่มีทางที่จะแน่ใจได้ว่าเว็บไซต์ที่คุณกำลังเชื่อมโยงจะยังคงอยู่ที่นั่นในวันพรุ่งนี้
Zachary Weixelbaum

ขอบคุณมากสำหรับความพยายามในการจัดหาวิธีแก้ปัญหาง่ายๆให้เรา
Adnan

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];สิ่งนี้จะให้ข้อมูลปีและเดือนด้วย
Caner SAYGIN

เพื่อป้องกันข้อผิดพลาด +1 วันเพียงแค่ลบ (24 * 60 * 60) จากการประทับเวลาต้นทางเป็นวินาที
andreszs

10

มีคำตอบที่ดีอยู่ที่นี่ แต่ไม่มีคำตอบใดที่ครอบคลุมความต้องการของฉัน ฉันสร้างขึ้นจากคำตอบของ Glavicเพื่อเพิ่มคุณสมบัติพิเศษบางอย่างที่ฉันต้องการ

  • อย่าพิมพ์เลขศูนย์ ดังนั้น "5 นาที" แทนที่จะเป็น "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
มันช่วยฉันได้มาก
Manojkiran

ฉันจะสร้างฟังก์ชั่นตามวิธีของคุณใน laravel
Manojkiran

8

สั้นง่ายเชื่อถือได้:

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

3
คำอธิบายเพิ่มเติมจะไปได้ไกลในคำตอบนี้เช่นค่าคงที่จำนวนเต็มแสดงถึงอะไรและการจัดรูปแบบสตริงทำงานกับ sprintf อย่างไร

1
ฉันจะทำ sprintf ('% dd:% 02dh:% 02dm:% 02ds', $ s / 86400, $ s / 3600% 24, $ s / 60% 60, $ s% 60); เพื่อให้มีความเป็นมนุษย์มากยิ่งขึ้น (เช่น 0d: 00h: 05m: 00s) แต่น่าจะเป็นทางออกที่ดีที่สุดที่นี่
Ricardo Martins

6

วิธีที่ง่ายที่สุดคือการสร้างเมธอดที่ส่งคืน DateInterval จาก DateTime :: diff ของเวลาสัมพัทธ์เป็น $ วินาทีจากเวลาปัจจุบัน $ ในขณะนี้ซึ่งคุณสามารถเชื่อมโยงและจัดรูปแบบได้ ตัวอย่างเช่น:-

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
คุณหายไปหลายวัน
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 ค่าและตั้งค่าเอกพจน์ / พหูพจน์ที่ถูกต้อง

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

Interval class ที่ฉันเขียนสามารถใช้ได้ สามารถใช้ในทางตรงกันข้ามได้เช่นกัน

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

1

ฉันไม่รู้ว่าทำไมคำตอบบางคำถึงยาวหรือซับซ้อนจนน่าขัน อย่างใดอย่างหนึ่งต่อไปนี้โดยใช้ชั้น DateTime คล้ายกับคำตอบของ 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;
}

คุณอาจต้องการเพิ่มความปลอดภัยให้กับฟังก์ชัน calctime เพื่อป้องกัน 0 วินาที รหัสปัจจุบันแสดงข้อผิดพลาด ห่อ$thetimeผลตอบแทนเช่นisset($thetime)
Stargazing Worm

ขอบคุณสำหรับคำแนะนำคุณเข้าใจถูกต้องเกี่ยวกับข้อผิดพลาด (ไม่น่าเชื่อว่าจะพลาด) ฉันได้อัปเดตโค้ดแล้ว!
Jason

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

วิธีแก้ปัญหาสำหรับสิ่งนี้ที่ฉันใช้ (ย้อนกลับไปในขณะที่เรียนรู้ PHP) โดยไม่มีฟังก์ชันใด ๆ ใน:

$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

-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มาจากไหน? ทำไมคุณถึงแนะนำเซสชั่น? สิ่งนี้ส่งคืนสตริงที่เหมาะสมเป็นวินาทีนาทีและชั่วโมงได้อย่างไร
Nico Haase

คำตอบ @NicoHaase อัปเดตแล้ว
Tayyab Hayat

-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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.