summaryrefslogtreecommitdiff
path: root/app/Model/DateParser.php
blob: 8a4d3edd472b4138e9babb99506e2dc76d7aaaac (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
143
144
145
146
147
148
149
150
151
152
153
154
<?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 string[]
     */
    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'),
        );
    }

    /**
     * Remove the time from a timestamp
     *
     * @access public
     * @param  integer    $timestamp    Timestamp
     * @return integer
     */
    public function removeTimeFromTimestamp($timestamp)
    {
        return mktime(0, 0, 0, date('m', $timestamp), date('d', $timestamp), date('Y', $timestamp));
    }

    /**
     * Get a timetstamp from an ISO date format
     *
     * @access public
     * @param  string   $date   Date format
     * @return integer
     */
    public function getTimestampFromIsoFormat($date)
    {
        return $this->removeTimeFromTimestamp(strtotime($date));
    }

    /**
     * Format date (form display)
     *
     * @access public
     * @param  array    $values   Database values
     * @param  string[] $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  string[] $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->removeTimeFromTimestamp($this->getTimestamp($values[$field]));
            }
        }
    }
}