Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
77.78% covered (success)
77.78%
7 / 9
CRAP
91.43% covered (success)
91.43%
64 / 70
Date
0.00% covered (danger)
0.00%
0 / 1
77.78% covered (success)
77.78%
7 / 9
27.46
91.43% covered (success)
91.43%
64 / 70
 format
0.00% covered (danger)
0.00%
0 / 1
8.10
88.46% covered (success)
88.46%
23 / 26
 cleanDate
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
6 / 6
 getExplode
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
4 / 4
 buildDateFromFourTeenDigital
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 buildDateFromTwelveDigital
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
8 / 8
 buildDateFromTeenDigital
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 buildDateFromEightDigit
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
 buildDateFromSixDigit
0.00% covered (danger)
0.00%
0 / 1
5.68
70.00% covered (success)
70.00%
7 / 10
 convertDate
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
4 / 4
1<?php
2
3namespace Qmp\Laravel\DictionaryFormatter\Formatters;
4
5use Illuminate\Support\Facades\Log;
6use MongoDB\BSON\UTCDateTime;
7use DateTime;
8use Exception;
9use Qmp\Laravel\DictionaryFormatter\Facades\DictionaryFormatter;
10
11class Date
12{
13
14    /**
15     * @var string
16     */
17    protected static $raw;
18
19    /**
20     * @var array
21     */
22    protected static $months = [
23        '01' => 'january|janvier',
24        '02' => 'february|fevrier',
25        '03' => 'march|mars',
26        '04' => 'april|avril',
27        '05' => 'may|mai',
28        '06' => 'june|juin',
29        '07' => 'july|juillet',
30        '08' => 'august|aout',
31        '09' => 'september|septembre',
32        '10' => 'october|octobre',
33        '11' => 'november|novembre',
34        '12' => 'december|decembre'
35    ];
36
37    /**
38     * @param string $value
39     * @param string $format
40     * @param string|null $in
41     * @return UTCDateTime|string
42     */
43    public static function format(string $value, string $format = 'Y-m-d H:i:s', string $in = null)
44    {
45        try {
46
47            self::$raw = $value;
48
49            if($in) {
50                return self::convertDate(DateTime::createFromFormat($in, $value), $format);
51            }
52
53            self::cleanDate($value);
54
55            $explode = self::getExplode($value);
56            $value = implode('', $explode);
57
58            switch (strlen($value)) {
59                case 14:
60                    self::buildDateFromFourTeenDigital($value);
61                    break;
62                case 12:
63                    self::buildDateFromTwelveDigital($value, $explode);
64                    break;
65                case 10:
66                    self::buildDateFromTeenDigital($value);
67                    break;
68                case 8;
69                    self::buildDateFromEightDigit($value);
70                    break;
71                case 6;
72                    self::buildDateFromSixDigit($value);
73                    break;
74            }
75
76            return self::convertDate(new DateTime($value), $format);
77
78        } catch (Exception $e) {
79            Log::debug('Unable to format date:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
80            return self::$raw;
81        }
82    }
83
84    /**
85     * @param string $date
86     */
87    protected static function cleanDate(string &$date)
88    {
89        $date = DictionaryFormatter::stripaccents($date);
90
91        collect(self::$months)->each(function ($month, $number) use (&$date) {
92            $date = preg_replace('/'.strtolower($month).'/i', $number, strtolower($date));
93        });
94
95        $date = preg_replace('#\s+#',' ',trim(preg_replace('#[^0-9]#',' ',$date)));
96    }
97
98    /**
99     * @param string $value
100     * @return false|string[]
101     */
102    protected static function getExplode(string $value)
103    {
104        $explode = explode(' ',$value);
105
106        foreach ($explode as $key => $number) {
107            $explode[$key] = intval($number) < 10 ? '0' . intval($number) : $number;
108        }
109
110        return $explode;
111    }
112
113    /**
114     * @param string $date
115     */
116    protected static function buildDateFromFourTeenDigital(string &$date): void
117    {
118        preg_match('/([0-9]{8})([0-9]{2})([0-9]{2})([0-9]{2})/', $date, $matches);
119
120        self::buildDateFromEightDigit($matches[1]);
121
122        $date = "$matches[1] $matches[2]:$matches[3]:$matches[4]";
123
124    }
125
126    /**
127     * @param string $date
128     * @param array $explode
129     */
130    protected static function buildDateFromTwelveDigital(string &$date, array $explode): void
131    {
132        $day = implode('', array_slice($explode,0,3));
133
134        if(count($explode) == 6) {
135            self::buildDateFromSixDigit($day);
136            $date = "$day $explode[3]:$explode[4]:$explode[5]";
137        }
138
139        if(count($explode) == 5) {
140            self::buildDateFromEightDigit($day);
141            $date = "$day $explode[3]:$explode[4]:00";
142        }
143    }
144
145    /**
146     * @param string $date
147     */
148    protected static function buildDateFromTeenDigital(string &$date): void
149    {
150        preg_match('/([0-9]{6})([0-9]{2})([0-9]{2})/', $date, $matches);
151
152        self::buildDateFromSixDigit($matches[1]);
153
154        $date = "$matches[1] $matches[2]:$matches[3]:00";
155    }
156
157    /**
158     * @param string $date
159     */
160    protected static function buildDateFromEightDigit(string &$date): void
161    {
162        if(substr($date,4,4)>1900) {
163            $date = preg_replace('#([0-9]{2})([0-9]{2})([0-9]{4})#','$3-$2-$1',$date);
164        } else {
165            $date = preg_replace('#([0-9]{4})([0-9]{2})([0-9]{2})#','$1-$2-$3',$date);
166        }
167    }
168
169    /**
170     * @param string $date
171     */
172    protected static function buildDateFromSixDigit(string &$date): void
173    {
174        if(substr($date,4,2)>31) {
175            $date = preg_replace('#([0-9]{2})([0-9]{2})([0-9]{2})#','19$3-$2-$1',$date);
176        } elseif(substr($date,0,2)>31) {
177            $date = preg_replace('#([0-9]{2})([0-9]{2})([0-9]{2})#','19$1-$2-$3',$date);
178        } elseif(substr($date,4,2)>date('y')) {
179            $date =preg_replace('#([0-9]{2})([0-9]{2})([0-9]{2})#','19$3-$2-$1',$date);
180        } elseif(substr($date,0,2)>date('y')) {
181            $date = preg_replace('#([0-9]{2})([0-9]{2})([0-9]{2})#','19$1-$2-$3',$date);
182        } else {
183            $date = preg_replace('#([0-9]{2})([0-9]{2})([0-9]{2})#','20$3-$2-$1',$date);
184        }
185    }
186
187    /**
188     * @param DateTime $date
189     * @param string $format
190     * @return UTCDateTime|string
191     * @throws Exception
192     */
193    protected static function convertDate(DateTime $date, string $format)
194    {
195        switch ($format) {
196            case 'mongo':
197                return new UTCDateTime($date);
198            default:
199                return $date->format($format);
200        }
201    }
202}