Sekunnit luettevaan muotoon

qin 31.05.05 16:15

Muuntaa sekuntien määrän ihmiselle selkeään muotoon

 Tekstiversio  Arvo: 0 (12 ääntä)  Äänestä: +  -
// Muuntaa sekuntien määrät luettavaan muotoon
function time_format($seconds) {
        settype ($seconds, 'integer');
        $seconds_given = $seconds;
        $takes_time = array(31536000, 2626560, 604800, 86400, 3600, 60);
        $delimeter = array(" vuotta", " kuukautta", " viikkoa", " päivää", " tuntia", " minuuttia");
        $output = array();
        foreach ($takes_time as $key => $val) {
           ${$suffixes[$key]} = ($val == 0) ? $seconds : floor(($seconds / $val));
           $seconds -= ${$suffixes[$key]} * $val;
           if (${$suffixes[$key]} > 0 || (!empty($output))) {
                   $to_output = ($key > 1 && strlen(${$suffixes[$key]}) == 1) ? ${$suffixes[$key]} : ${$suffixes[$key]};
                   $to_output .= $delimeter[$key];
                   $output[] = $to_output;
           }
        }

        if ($seconds_given >= 60) {
                $output = array_slice($output, 0, 2);
                $output_string = implode(', ', $output);
        } else {
                $output_string = 'Alle minuutti!';
        }
        return trim($output_string);
}

editoitu: 16:26 31.5.05
qin 16:17 31.5.05 
Tämä siis näyttää jopa vuosia jos niikseen tulee, ja näyttää aina vain kaksi suurinta yksikköä, esim: "4 vuotta, 3, kuukautta" tai "3 viikkoa, 5 päivää"
editoitu: 12:26 21.6.05
chiman 17:36 31.5.05 
Käytännöllinen pieni koodipätkä. En tiedä onko sopivaa, mutta liitän tähän vastaavan funktion, jonka koodasin Pythonilla joskus kuukausia sitten. Tulostus on muotoa "3d 15h ago".
python:

def time_format(secs):
    ago = []
    for c, val in [['d', 86400], ['h', 3600], ['m', 60], ['s', 1]]:
        if secs >= val:
            ago.append('%d%s' % (secs / val, c))
            secs = secs % val
    return ' '.join(ago[:2]) + ' ago'
 

Edit: Kokeillaan uuden Python-värityksen toimivuutta.
Kryil 18:29 31.5.05 
Voisi tehdä lyhemminkin. Ja php:n luonteen tietäen lyhyt == nopea == hyvä.

Ja miksi vain minuutin tarkkuudella?
Linkku 09:22 1.6.05 
Ja tässä vielä Perlillä toteutettu versio
#!/usr/bin/perl -w
use strict;

$\ = "\n";

sub time_format($) {
    my $secs = $_[0];
    my @ago;
    for (['d', 86400], ['h', 3600], ['m', 60], ['s', 1]) {
        my ($c, $val) = @{$_};
        if ( $secs>=$val ) {
            push @ago, int(($secs/$val)) .$c;
            $secs = $secs % $val;
        }
    }
    return join ' ', @ago;
}

# tulostaa 4h 15m 25s
print time_format(15325);
qin 12:13 1.6.05 
No noissa em. "lyhennetyissä" versioissa juuri puuttuu noita featureja omaani verrattuna, joka tulostaa siis aina optimaalisimmalla ja ihmissilmälle kauneimmalla mahdollisella tavalla ajan, ei esim: "0d 0h 32m 0s"
Linkku 12:34 1.6.05 
qin kirjoitti:
No noissa em. "lyhennetyissä" versioissa juuri puuttuu noita featureja omaani verrattuna, joka tulostaa siis aina optimaalisimmalla ja ihmissilmälle kauneimmalla mahdollisella tavalla ajan, ei esim: "0d 0h 32m 0s"

Ei toi mun koodi ainakaan tulosta nollia
chiman 11:06 2.6.05 
Oma koodini näyttää kaksi suurinta nollasta poikkeavaa ryhmää. Eli esim. "4d 5m", "32s", "2m 10s" tai "6m" (jos on tasan 6 minuuttia). Siksi halusinkin liittää oman koodini tuohon, koska sen toiminta vastasi hämmästyttävästi qinin omaa. Oli kiva nähdä myös tuo Linkun tekemä Perl-versio, vaikka pidänkin Pythonin syntaksista enemmän :)
Linkku 11:35 2.6.05 
chiman kirjoitti:
Oma koodini näyttää kaksi suurinta nollasta poikkeavaa ryhmää.

Ehdinkin jo ihmetellä, että kumpi koodi on rikki. :) Sitten suomasin tuon
[:2]
editoitu: 00:49 8.6.05
ane 00:48 8.6.05 
Tuota wtf. En oikein näessä tässä pätkässä järkeä, kun PHP:ssä (ja C:ssäkin) on tällainen sisäänrakennettuna. Ja localeita käyttämällä tuokin funkkari tulostaa suomea.

http://fi.php.net/strftime
chiman 10:09 8.6.05 
Milläs argumenteilla tuon strftimen saa näyttämään kaksi suurinta (nollasta poikkeavaa) yksikköä?
editoitu: 18:26 11.6.05
Ztane 18:19 11.6.05 
ja mitä järkiä on tulostaa kuukausia ja vuosia tuolleen... "12 kuukautta 0 viikkoa" ja sitten "1 vuosi 0 kuukautta"... iha tolkutonta... varsinki ko kuukauksien pituus ei tiettävästi oo vakio.
editoitu: 15:50 27.11.05
Grez 15:42 27.11.05 
Eihän vuosienkaan pituus ole vakio. Oikeastaan viikon jälkeen seuraava vakiopituinen yksikkö olisi "tuplavuosituhat" eli 730484 päivää.

Tietty jos otetaan karkaussekunnitkin huomioon, niin sitten edes päivän pituus ei ole aina vakio.