Ticket #623 (new enhancement)

Opened 2 months ago

Last modified 2 months ago

Méthode substract perso

Reported by: hadrien Assigned to:
Priority: normal Milestone:
Component: jelix:utils Version: 1.0.4
Severity: normal Keywords:
Cc: Php version:
Review: Hosting Provider:
Documentation needed: 0 Blocking:

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

06/16/08 17:30:10 changed by hadrien

OBDate étant une classe héritant de jDateTime…

07/02/08 14:25:18 changed 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 ;)

07/02/08 14:42:55 changed 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.

07/02/08 15:16:09 changed by bballizlife

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

07/07/08 11:48:04 changed by laurentj

  • owner changed.
  • component changed from jelix to jelix:utils.
Download in other formats: Comma-delimited Text Tab-delimited Text RSS Feed