Ticket #425 (closed enhancement: fixed)

Opened 10 months ago

Last modified 2 months ago

add a jDuration object

Reported by: laurentj Assigned to: flh
Priority: normal Milestone: Jelix 1.1 beta 1
Component: jelix:utils Version: 1.0
Severity: minor Keywords:
Cc: Php version:
Review: Hosting Provider:
Documentation needed: 0 Blocking: 453

Description

Some methods of jDateTime accept or return a jDateTime object, which contains in fact a duration, not a date. So it is not really clear. It should accept or return an other object like a "jDuration" object.

Attachments

jduration.patch (12.0 kB) - added by flh on 02/17/08 18:50:58.
Proposition de patch avec tests unitaires

Change History

02/08/08 10:30:26 changed by flh

  • status changed from new to assigned.
  • owner set to flh.
  • blocking set to 453.

02/17/08 18:50:58 changed by flh

  • attachment jduration.patch added.

Proposition de patch avec tests unitaires

02/17/08 18:58:32 changed by flh

  • review changed.

La représentation d'une durée est un truc bien épineux : il est impossible de convertir systématiquement un mois en jours, ni un jour en heures (à cause des heures d'été/hiver). J'ai choisi une représentation stockant la différence en mois/jour/secondes (un an devient 12 mois, etc.).

Cela a l'air de bien fonctionner (tests unitaires inclus) : il reste les bizarreries inhérentes à la représentation d'une durée : 31 mars + 1 mois, cela fait-il 30 avril ou 1er mai ? Pour l'instant le module choisit 1er mai (c'est le plus facile à implémenter), mais il n'est pas exclu que l'on fournisse un jour une option pour forcer l'autre comportement (à l'image de l'option end_of_month de DateTime::Duration en Perl).

02/18/08 10:00:14 changed by flh

  • review set to review?.

02/20/08 12:36:51 changed by laurentj

  • review changed from review? to review-.

Salut,

+            if(isset($init['day'])){
+                $this->days += intval($init['days']);
+            }

Ça devrait être 'day' et pas 'days'.

@@ -386,33 +388,39 @@
      * @param int $second second with 2 digits
      */
     public function sub($year, $month=0, $day=0, $hour=0, $minute=0, $second=0) {
-        if ($year instanceof jDateTime) {
+        if ($year instanceof jDuration) {
             $dt = $year;
         } else {
             $dt = new jDateTime($year, $month, $day, $hour, $minute, $second);
         }

Je pense que le else devrait être plutôt (les tests passent pas : Fatal error: Call to undefined method jDateTime::mult()) :

         } else {
-            $dt = new jDateTime($year, $month, $day, $hour, $minute, $second);
+            $dt = new jDuration(array("year" => $year, "month" => $month,
+                "day" => $day, "hour" => $hour, "minute" => $minute,
+                "second" => $second));
         }

Après correction de ces erreurs, il reste quand même des erreurs découvertes dans les tests unitaires :

Fail: /home/jouanneau/public_html/jelixapp/testapp/modules/jelix_tests/tests/utils.jdatetime.html_cli.php -> testjDateTime -> testsetFromString -> Equal expectation fails with member [year] because [Integer: 2007] differs from [Integer: 2006] by 1 at [/home/jouanneau/public_html/jelixapp/testapp/modules/jelix_tests/tests/utils.jdatetime.html_cli.php line 173]
Exception: /home/jouanneau/public_html/jelixapp/testapp/modules/jelix_tests/tests/utils.jdatetime.html_cli.php -> testjDateTime -> testsetFromString -> Unexpected PHP error [Object of class jDateTime could not be converted to int] severity [E_NOTICE] in [/home/jouanneau/public_html/jelixapp/lib/jelix/utils/jDuration.class.php] line [42]

Il manque aussi la déclaration des fichiers testapp/modules/jelix_tests/tests/utils.jduration.html_cli.php et lib/jelix/utils/jDuration.class.php dans les fichiers manifests pour le build, mais je les rajouterais lors du checkin si tu ne le fais pas.

au fait, veux-tu un accés en écriture au dépôt svn ?

04/13/08 14:08:31 changed by laurentj

  • status changed from assigned to closed.
  • docneeded changed.
  • review deleted.
  • resolution set to fixed.

Ayant besoin de cette classe, j'ai finalement fait les petites corrections qui s'imposait.

Patch appliqué dans le trunk. Merci pour ce patch Florian :-)

04/13/08 14:12:05 changed by flh

Pas de quoi, même si j'ai été trop débordé ces temps-ci pour réussir à en faire un patch propre. :-)

09/27/08 23:23:06 changed by laurentj

  • docneeded set to 1.

09/28/08 10:43:01 changed by laurentj

  • docneeded deleted.
Download in other formats: Comma-delimited Text Tab-delimited Text RSS Feed