summaryrefslogtreecommitdiff
path: root/app/Model/DateParser.php
blob: 38265f984cd4a2a3fd64672ebc761654eeda804b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php

namespace Model;

use DateTime;

/**
 * Date parser model
 *
 * @package  model
 * @author   Frederic Guillot
 */
class DateParser extends Base
{
    /**
     * Return a timestamp if the given date format is correct otherwise return 0
     *
     * @access public
     * @param  string   $value  Date to parse
     * @param  string   $format Date format
     * @return integer
     */
    public function getValidDate($value, $format)
    {
        $date = DateTime::createFromFormat($format, $value);

        if ($date !== false) {
            $errors = DateTime::getLastErrors();
            if ($errors['error_count'] === 0 && $errors['warning_count'] === 0) {
                $timestamp = $date->getTimestamp();
                return $timestamp > 0 ? $timestamp : 0;
            }
        }

        return 0;
    }

    /**
     * Parse a date ad return a unix timestamp, try different date formats
     *
     * @access public
     * @param  string   $value   Date to parse
     * @return integer
     */
    public function getTimestamp($value)
    {
        foreach ($this->getDateFormats() as $format) {

            $timestamp = $this->getValidDate($value, $format);

            if ($timestamp !== 0) {
                return $timestamp;
            }
        }

        return 0;
    }

    /**
     * Return the list of supported date formats (for the parser)
     *
     * @access public
     * @return array
     */
    public function getDateFormats()
    {
        return array(
            $this->config->get('application_date_format', 'm/d/Y'),
            'Y-m-d',
            'Y_m_d',
        );
    }

    /**
     * Return the list of available date formats (for the config page)
     *
     * @access public
     * @return array
     */
    public function getAvailableFormats()
    {
        return array(
            'm/d/Y' => date('m/d/Y'),
            'd/m/Y' => date('d/m/Y'),
            'Y/m/d' => date('Y/m/d'),
        );
    }

    /**
     * For a given timestamp, reset the date to midnight
     *
     * @access public
     * @param  integer    $timestamp    Timestamp
     * @return integer
     */
    public function resetDateToMidnight($timestamp)
    {
        return mktime(0, 0, 0, date('m', $timestamp), date('d', $timestamp), date('Y', $timestamp));
    }

    /**
     * Format date (form display)
     *
     * @access public
     * @param  array    $values   Database values
     * @param  array    $fields   Date fields
     * @param  string   $format   Date format
     */
    public function format(array &$values, array $fields, $format = '')
    {
        if ($format === '') {
            $format = $this->config->get('application_date_format');
        }

        foreach ($fields as $field) {

            if (! empty($values[$field])) {
                $values[$field] = date($format, $values[$field]);
            }
            else {
                $values[$field] = '';
            }
        }
    }

    /**
     * Convert date (form input data)
     *
     * @access public
     * @param  array    $values   Database values
     * @param  array    $fields   Date fields
     */
    public function convert(array &$values, array $fields)
    {
        foreach ($fields as $field) {

            if (! empty($values[$field]) && ! is_numeric($values[$field])) {
                $values[$field] = $this->getTimestamp($values[$field]);
            }
        }
    }
}