developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Opened 12 years ago

Closed 11 years ago

Last modified 10 years ago

#623 closed enhancement (fixed)

Méthode substract perso

Reported by: hadrien Owned by:
Priority: normal Milestone: Jelix 1.2 beta
Component: jelix:utils Version: 1.0.4
Severity: normal Keywords:
Cc: Blocked By:
Blocking: Documentation needed: no
Hosting Provider: Php version:

Description

Voici une méthode pour jDateTime que j'ai recodé pour nos besoins personnels. Si ça vous tente, faites en bon usage :

/**
         * Substract a date with another
         *
         * @return OBDate
         * @author Hadrien Lanneau <hadrien@over-blog.com>
         */
        public function substract($date = null)
        {
                if (!$date)
                {
                        $date = new OBDate();
                        $date->now();
                }
                
                $newDate = new OBDate();
                
                $items = array(
                        'second',
                        'minute',
                        'hour',
                        'day',
                        'month',
                        'year'
                );
                foreach ($items as $k => $i)
                {
                        $newDate->{$i} = $date->{$i} - $this->{$i};
                        if ($newDate->{$i} < 0)
                        {
                                switch ($i)
                                {
                                        case 'second':
                                        case 'minute':
                                                $sub = 60;
                                                break;
                                        case 'hour':
                                                $sub = 24;
                                                break;
                                        case 'day':
                                                switch ($this->month)
                                                {
                                                        // Mois à 31 jours
                                                        case 1:
                                                        case 3:
                                                        case 5:
                                                        case 7:
                                                        case 8:
                                                        case 10:
                                                        case 12:
                                                                $sub = 31;
                                                                break;
                                                        // Mois à 30 jours
                                                        case 4:
                                                        case 6:
                                                        case 9:
                                                        case 11:
                                                                $sub = 30;
                                                                break;
                                                        // Février
                                                        case 2:
                                                                if ($this->year % 4 == 0 and
                                                                        !(
                                                                                $this->year % 100 == 0 and
                                                                                $this->year % 400 != 0
                                                                        ))
                                                                {
                                                                        // Bissextile
                                                                        $sub = 29;
                                                                }
                                                                else
                                                                {
                                                                        $sub = 28;
                                                                }
                                                                break;
                                                }
                                                break;
                                        case 'month':
                                                $sub = 12;
                                                break;
                                        default:
                                                $sub = 0;
                                }
                                $newDate->{$i} = abs($sub + $newDate->{$i});
                                if (isset($items[$k+1]))
                                {
                                        $date->{$items[$k+1]}--;
                                }
                        }
                }
                
                return $newDate;
        }

Change History (8)

comment:1 Changed 12 years ago by hadrien

OBDate étant une classe héritant de jDateTime…

comment:2 Changed 12 years ago by bballizlife

When providing new features or enhancement, thanks for following the guidelines.

Thank you too for explaining why do you provide such code. We already have a sub() method in jDateTime class, why proposing another one ? If your is better, correcting some bugs, ... explain us please ;)

comment:3 Changed 12 years ago by hadrien

Cette méthode a été écrite car la méthode durationTo ne nous convenait pas. Bugguée dans les précédentes version et renvoyant un jDuration dans la 1.0.4, là où nous avions besoin d'un jDateTime.

Cette méthode renvoie un jDateTime contenant le nombre d'année, mois, jour, heure, minute et secondes de différences entre deux jDateTime en prenant en compte les mois de 30/31 jours et les années bissextiles. Le traitement se fait uniquement sur des comparaisons des des variables de chacun des objets, pas d'utilisation de fonction de date. La méthode devrait donc être très rapide et rester très précise.

Les points de vue concernants les différences entre deux dates étant très disparates, je ne me permet pas de proposer un patch sur Jelix et vous laisse ce code au cas où il vous plairait.

comment:4 Changed 12 years ago by bballizlife

Thanks for the description ! Now we could analyze the ticket with more informations.

comment:5 Changed 12 years ago by laurentj

  • Component changed from jelix to jelix:utils

comment:6 Changed 11 years ago by laurentj

  • Milestone set to Jelix 1.2
  • Resolution set to fixed
  • Status changed from new to closed

comment:7 Changed 10 years ago by laurentj

  • Documentation needed set
Note: See TracTickets for help on using tickets.