Passed
Push — master ( db8c15...31c0b7 )
by Esteban De La Fuente
04:32
created

Date::validateAndConvert()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 17
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 5

Importance

Changes 0
Metric Value
cc 5
eloc 10
c 0
b 0
f 0
nc 5
nop 2
dl 0
loc 17
ccs 9
cts 9
cp 1
crap 5
rs 9.6111
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * Derafu: Biblioteca PHP (Núcleo).
7
 * Copyright (C) Derafu <https://www.derafu.org>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la Licencia Pública General Affero de GNU publicada por
11
 * la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o
12
 * (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública
17
 * General Affero de GNU para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
20
 * junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace Derafu\Lib\Core\Helper;
26
27
use Carbon\Carbon;
28
use Carbon\Exceptions\InvalidFormatException;
29
30
/**
31
 * Clase para trabajar con fecha en PHP.
32
 *
33
 * Extiende las funcionalidades de Carbon
34
 */
35
class Date extends Carbon
36
{
37
    /**
38
     * Días de la semana en español.
39
     *
40
     * @var array
41
     */
42
    private const DAYS = [
43
        'domingo',
44
        'lunes',
45
        'martes',
46
        'miércoles',
47
        'jueves',
48
        'viernes',
49
        'sábado',
50
    ];
51
52
    /**
53
     * Meses del año en español.
54
     *
55
     * @var array
56
     */
57
    private const MONTHS = [
58
        'enero',
59
        'febrero',
60
        'marzo',
61
        'abril',
62
        'mayo',
63
        'junio',
64
        'julio',
65
        'agosto',
66
        'septiembre',
67
        'octubre',
68
        'noviembre',
69
        'diciembre',
70
    ];
71
72
    /**
73
     * Formatea una fecha en formato YYYY-MM-DD a un string en español.
74
     *
75
     * @param string $date
76
     * @param bool $showDay
77
     * @return string
78
     */
79 1
    public static function formatSpanish(string $date, bool $showDay = true): string
80
    {
81 1
        $unixtime = strtotime($date);
82 1
        $string = date('j \d\e \M\O\N\T\H \d\e\l Y', $unixtime);
83 1
        if ($showDay) {
84 1
            $string = 'DAY ' . $string;
85
        }
86 1
        $day = self::DAYS[date('w', $unixtime)];
87 1
        $month = self::MONTHS[date('n', $unixtime) - 1];
88
89 1
        return str_replace(['DAY', 'MONTH'], [$day, $month], $string);
90
    }
91
92
    /**
93
     * Valida si una fecha está en el formato Y-m-d y la convierte a un nuevo
94
     * formato.
95
     *
96
     * @param string $date
97
     * @return string|null
98
     */
99 4
    public static function validateAndConvert(
100
        string $date,
101
        string $format = 'd/m/Y'
102
    ): ?string {
103
        try {
104
105 4
            $carbonDate = self::createFromFormat('Y-m-d', $date);
106
            if (
107 3
                $carbonDate === null
108 3
                || $carbonDate->format('Y-m-d') !== $date
109 3
                || $carbonDate->getLastErrors()['error_count'] > 0
110
            ) {
111 1
                return null;
112
            }
113 2
            return $carbonDate->format($format);
114 2
        } catch (InvalidFormatException $e) {
115 2
            return null;
116
        }
117
    }
118
}
119