Time to Text

Gepost door PHP 6 op 19-02-2009 19:02.

TIME TO TEXT

Het komt steeds vaker voor dat je naast een datum een stuk tekst hebt waar je kunt zien hoelang de plaats datum geleden is. Ik zelf kon geen degelijk PHP script vinden wat voldoet aan mijn eisen dus schreef ik het volgende:

Het script geeft een output die je zelf kunt samenstellen uit de volgende instellingen:

## Formaat ##
%y geeft het aantal jaren
%m geeft het aantal maanden
%w geeft het aantal weken
%d geeft het aantal dagen
%h geeft het aantal uren
%i geeft het aantal minuten
%s geeft het aantal seconden
- Een formaat zoals: "%h %i %s" is dus gewoon mogelijk!

## Word ##
0 geeft volledige woorden (Minuut, minuten)
1 geeft afkortingen (j, m, d)
2 geeft geen benaming

## Type ##
0 geeft altijd een output van een formaat ook als dit 0 is.
0 geeft alleen een output van een formaat wanneer deze hoger als 0 is

Voorbeelden:
62 seconden met formaat "%i" geeft als ouput "1 minuut"
62 seconden met formaat "%i %s" geeft als output "1 minuut 2 seconden"
4672 seconden met formaat "%i %s" geeft als output "77 minuten 52 seconden"
4672 seconden met formaat "%h %i %s" geeft als output "1 uur 17 minuten 52 seconden"
4672 seconden met formaat "%h %i" geeft als output "1 uur 17 minuten"
200000 seconden met formaat "%d" geeft als output "2 dagen"
200000 seconden met formaat "%d %h" geeft als output "2 dagen 7 uur"
200000 seconden met formaat "%d %h %i" geeft als output "2 dagen 7 uur 33 minuten"
200000 seconden met formaat "%d %h %i %s" geeft als output "2 dagen 7 uur 33 minuten 20 seconden"
2004321 seconden met formaat "%w" geeft als output "3 weken"
2004321 seconden met formaat "%w %s" geeft als output "3 weken 189921 seconden"
1851854151 seconden met formaat "%y %m %w %d %h %i %s" geeft als output "58 jaar 8 maanden 3 weken 2 dagen 11 uur 55 minuten 51 seconden"
1851854151 seconden met formaat "%m" geeft als output "714 maanden"

Let op: Je moet het aantal seconden ingeven waarover je een aangepast formaat wilt berekenen!

Kritiek is welkom!

Bestanden van dit script

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
error_reporting(E_ALL);

/*
Door: A.K van Schayk
Datum: 19-02-2009
*/

  
  /*
  Geef hier het aantal seconden*/
  $seconden = 345678;
  
  /*
  $format "%y" geeft het aantal jaren.
  $format "%m" geeft het aantal maanden
  $format "%w" geeft het aantal weken
  $format "%d" geeft het aantal dagen
  $format "%h" geeft het aantal uren
  $format "%i" geeft het aantal minuten
  $format "%s" geeft het aantal seconden */
  $format = '%h %i %s';
  
  /*
  $word "0" geeft volledige woorden (uren, minuten)
  $word "1" geeft afkortingen zoals (j, m, d)
  $word "2" geeft geen benaming alleen een output in cijfers*/
  $word = 0;
  
  /*
  $type "0" Geeft als een $format 0 is gewoon de tijd weer met een 0 (Bijvoorbeeld: 0s, 0 seconden)
  $type "1" Geeft als een $format 0 is geen output over het formaat
  */
  $type = 1;

function timetotext($seconden, $format, $word, $type){
    $output = strtolower($format);
    $part[]['settings'] = array('%y', 60 * 60 * 24 * 365, ' jaar', ' jaar', 'y');
    $part[]['settings'] = array('%m', 60 * 60 * 24 * 30, ' maand', ' maanden', 'm');
    $part[]['settings'] = array('%w', 60 * 60 * 24 * 7, ' week', ' weken', 'w');
    $part[]['settings'] = array('%d', 60 * 60 * 24, ' dag', ' dagen', 'd');
    $part[]['settings'] = array('%h', 60 * 60, ' uur', ' uur', 'h');
    $part[]['settings'] = array('%i', 60, ' minuut', ' minuten', 'i');
    $part[]['settings'] = array('%s', 1, ' seconden', ' seconden', 's');
        
    $row = 0;
    while($row <= count($part) - 1){
        if(strpos($output, $part[$row]['settings'][0]) !== false){
            if($seconden >= $part[$row]['settings'][1]){
                $thispart_output = floor($seconden / $part[$row]['settings'][1]);
                $seconden = $seconden % $part[$row]['settings'][1];
                if($thispart_output <= 0){
                    if($type == 1) $thispart_output = '';
                } else if($thispart_output == 1 && $word <= 1){
                    if($word == 0) $thispart_output .= $part[$row]['settings'][2];
                    if($word == 1) $thispart_output .= $part[$row]['settings'][4];
                } else if($thispart_output > 1 && $word <= 1){
                    if($word == 0) $thispart_output .= $part[$row]['settings'][3];
                    if($word == 1) $thispart_output .= $part[$row]['settings'][4];
                }
            } else {
                $thispart_output = '';
                if($type == 0){
                    $thispart_output = '0';
                    if($word == 0) $thispart_output .= $part[$row]['settings'][3];
                    if($word == 1) $thispart_output .= $part[$row]['settings'][4];
                }
            }
            $output = str_replace($part[$row]['settings'][0], $thispart_output, $output);
        }
        $row++;
    }
    return $output;
}

echo timetotext($seconden, $format, $word, $type);
?>

Commentaar

19-02-2009 19:47

"Ik zelf kon geen degelijk PHP script vinden wat voldoet aan mijn eisen"

Daar bestaan functies voor:
http://nl3.php.net/manual/en/datetime.diff.php
http://nl3.php.net/manual/en/datetime.format.php

1
2
3
<?php
header( 'Location: http://www.php.net' );
?>
19-02-2009 23:03

@Martin,

Kun je een voorbeeld laten zien?

"2008-08-03T14:52:10+01:00"

Was niet de gewenste output.

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
20-02-2009 15:35

Vermeld hier alle zaken betreffende valkuilen, handige informatie, (installatie-)instructies e.d.

1
één maar, een jaar is geen 365 dagen maar een betere benadering zou 364.25 dagen zijn.
20-02-2009 22:10

Ook dat is fout, je zit er zelfs een volle dag naast. 1 jaar is op de kop af 365,2425 dag.

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
20-02-2009 23:54

Dat is niet zo heel moeilijk.

1
2
3
4
5
6
7
<?php
$pDate1 = new DateTime ('2007-01-02 03:04:05');
$pDate2 = new DateTime ('2009-02-20 23:51:23');

$pDifference = $pDate1 -> diff ($pDate2);
echo $pDifference -> format ('%Y years, %m months, %d days, %h hours, %m minutes, %s seconds');
?>
21-02-2009 09:19

Vermeld hier alle zaken betreffende valkuilen, handige informatie, (installatie-)instructies e.d.

1
2
3
4
5
Een jaar heft geen vaste lengte, net als een maand. Lang leve de schrikkeljaren.

Als je het verschil tussen twee datums weergeeft moetje rekening houden met de datums zelf, anders ga je de mist in. Van 1-jan t/m 1-mrt is 31+28+1 dagen, en zo is 1jan-1jan drie op de vier jaren 365 dagen en een keer 366.

Afijn, dit is gepruttel in de marge omdat je de uitkomst van deze functie nooit zult gebruiken vor berekeningen, maar toch, het staat zo raar als je zegt dat 1-feb-1mrt bestaat uit 30.3 dagen.
21-02-2009 11:17

@Peter: Zo wouw :)
Ik wist niet dat je DateTime::diff() zo kon gebruiken!

Bedankt voor de tip.
dit had ik dus twee jaar geleden nodig...

1
2
3
<?php
echo "Programmers are tools for converting caffeine into code.";
?>
23-02-2009 09:09

> Als je het verschil tussen twee datums weergeeft moetje
> rekening houden met de datums zelf, anders ga je de mist
> in. Van 1-jan t/m 1-mrt is 31+28+1 dagen, en zo is
> 1jan-1jan drie op de vier jaren 365 dagen en een keer 366.

En die regel geldt dan een keer in de duizend jaar weer niet. Gebruik gewoon DateTime, die is er echt een stuk beter in.

1
2
3
<?php
foo( );
?>
Inloggen wachtwoord vergeten? Aanmelden