Completed
Pull Request — master (#129)
by
unknown
04:01
created

DatePart::parseDateToken()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 9
ccs 5
cts 5
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * This file is part of the ZBateson\MailMimeParser project.
4
 *
5
 * @license http://opensource.org/licenses/bsd-license.php BSD
6
 */
7
namespace ZBateson\MailMimeParser\Header\Part;
8
9
use ZBateson\MbWrapper\MbWrapper;
10
use DateTime;
11
use Exception;
12
13
/**
14
 * Parses a header into a DateTime object.
15
 *
16
 * @author Zaahid Bateson
17
 */
18
class DatePart extends LiteralPart
19
{
20
    /**
21
     * @var DateTime the parsed date, or null if the date could not be parsed
22
     */
23
    protected $date;
24
25
    /**
26
     * Tries parsing the passed token as an RFC 2822 date, and failing that into
27
     * an RFC 822 date, and failing that, tries to parse it by calling
28
     * ``` new DateTime($value) ```.
29
     *
30
     * @param MbWrapper $charsetConverter
31
     * @param string $token
32
     */
33 2
    public function __construct(MbWrapper $charsetConverter, $token)
34
    {
35 2
        $dateToken = trim($token);
36
        // parent::__construct converts character encoding -- may cause problems sometimes.
37 2
        parent::__construct($charsetConverter, $dateToken);
38
39
        // Missing "+" in timezone definition. eg: Thu, 13 Mar 2014 15:02:47 0000 (not RFC compliant)
40
        // Won't result in an Exception, but in a valid DateTime in year `0000` - therefore we need to check this first:
41 2
        if (preg_match('# [0-9]{4}$#', $dateToken)) {
42
            try {
43 1
                $this->date = new DateTime(preg_replace('# ([0-9]{4})$#', ' +$1', $dateToken));
44
                // $this->addParsingError('Invalid Date: "+/-" missing before timezone definition');
45
            } catch (Exception $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
46
            }
47
        }
48
49 2
        if (!isset($this->date))
50
        {
51
            try {
52 2
                $this->date = new DateTime($dateToken);
53 2
            } catch (Exception $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
54
            }
55
        }
56
57
        // @see https://bugs.php.net/bug.php?id=42486
58
        // TODO: Test is missing:
0 ignored issues
show
Coding Style Best Practice introduced by
Comments for TODO tasks are often forgotten in the code; it might be better to use a dedicated issue tracker.
Loading history...
59 2
        if (!isset($this->date) && preg_match('#UT$#', $dateToken)) {
60
            try {
61 1
                $this->date = new DateTime($dateToken . 'C');
62
                // $this->addParsingError('Invalid Date: "C" missing from timezone "UT"'); // https://github.com/zbateson/mail-mime-parser/issues/124
63
            } catch (Exception $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
64
            }
65
        }
66 2
    }
67
68
    /**
69
     * Returns a DateTime object or false if it can't be parsed.
70
     *
71
     * @return DateTime
72
     */
73 2
    public function getDateTime()
74
    {
75 2
        return $this->date;
76
    }
77
}
78