xref: /plugin/davcal/vendor/sabre/vobject/tests/VObject/DateTimeParserTest.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\VObject;
4*a1a3b679SAndreas Boehler
5*a1a3b679SAndreas Boehleruse DateTime;
6*a1a3b679SAndreas Boehleruse DateTimeZone;
7*a1a3b679SAndreas Boehleruse DateInterval;
8*a1a3b679SAndreas Boehler
9*a1a3b679SAndreas Boehlerclass DateTimeParserTest extends \PHPUnit_Framework_TestCase {
10*a1a3b679SAndreas Boehler
11*a1a3b679SAndreas Boehler    function testParseICalendarDuration() {
12*a1a3b679SAndreas Boehler
13*a1a3b679SAndreas Boehler        $this->assertEquals('+1 weeks', DateTimeParser::parseDuration('P1W',true));
14*a1a3b679SAndreas Boehler        $this->assertEquals('+5 days',  DateTimeParser::parseDuration('P5D',true));
15*a1a3b679SAndreas Boehler        $this->assertEquals('+5 days 3 hours 50 minutes 12 seconds', DateTimeParser::parseDuration('P5DT3H50M12S',true));
16*a1a3b679SAndreas Boehler        $this->assertEquals('-1 weeks 50 minutes', DateTimeParser::parseDuration('-P1WT50M',true));
17*a1a3b679SAndreas Boehler        $this->assertEquals('+50 days 3 hours 2 seconds', DateTimeParser::parseDuration('+P50DT3H2S',true));
18*a1a3b679SAndreas Boehler        $this->assertEquals('+0 seconds', DateTimeParser::parseDuration('+PT0S',true));
19*a1a3b679SAndreas Boehler        $this->assertEquals(new DateInterval('PT0S'), DateTimeParser::parseDuration('PT0S'));
20*a1a3b679SAndreas Boehler
21*a1a3b679SAndreas Boehler    }
22*a1a3b679SAndreas Boehler
23*a1a3b679SAndreas Boehler    function testParseICalendarDurationDateInterval() {
24*a1a3b679SAndreas Boehler
25*a1a3b679SAndreas Boehler        $expected = new DateInterval('P7D');
26*a1a3b679SAndreas Boehler        $this->assertEquals($expected, DateTimeParser::parseDuration('P1W'));
27*a1a3b679SAndreas Boehler        $this->assertEquals($expected, DateTimeParser::parse('P1W'));
28*a1a3b679SAndreas Boehler
29*a1a3b679SAndreas Boehler        $expected = new DateInterval('PT3M');
30*a1a3b679SAndreas Boehler        $expected->invert = true;
31*a1a3b679SAndreas Boehler        $this->assertEquals($expected, DateTimeParser::parseDuration('-PT3M'));
32*a1a3b679SAndreas Boehler
33*a1a3b679SAndreas Boehler    }
34*a1a3b679SAndreas Boehler
35*a1a3b679SAndreas Boehler    /**
36*a1a3b679SAndreas Boehler     * @expectedException LogicException
37*a1a3b679SAndreas Boehler     */
38*a1a3b679SAndreas Boehler    function testParseICalendarDurationFail() {
39*a1a3b679SAndreas Boehler
40*a1a3b679SAndreas Boehler        DateTimeParser::parseDuration('P1X',true);
41*a1a3b679SAndreas Boehler
42*a1a3b679SAndreas Boehler    }
43*a1a3b679SAndreas Boehler
44*a1a3b679SAndreas Boehler    function testParseICalendarDateTime() {
45*a1a3b679SAndreas Boehler
46*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parseDateTime('20100316T141405');
47*a1a3b679SAndreas Boehler
48*a1a3b679SAndreas Boehler        $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC'));
49*a1a3b679SAndreas Boehler
50*a1a3b679SAndreas Boehler        $this->assertEquals($compare, $dateTime);
51*a1a3b679SAndreas Boehler
52*a1a3b679SAndreas Boehler    }
53*a1a3b679SAndreas Boehler
54*a1a3b679SAndreas Boehler    /**
55*a1a3b679SAndreas Boehler     * @depends testParseICalendarDateTime
56*a1a3b679SAndreas Boehler     * @expectedException LogicException
57*a1a3b679SAndreas Boehler     */
58*a1a3b679SAndreas Boehler    function testParseICalendarDateTimeBadFormat() {
59*a1a3b679SAndreas Boehler
60*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parseDateTime('20100316T141405 ');
61*a1a3b679SAndreas Boehler
62*a1a3b679SAndreas Boehler    }
63*a1a3b679SAndreas Boehler
64*a1a3b679SAndreas Boehler    /**
65*a1a3b679SAndreas Boehler     * @depends testParseICalendarDateTime
66*a1a3b679SAndreas Boehler     */
67*a1a3b679SAndreas Boehler    function testParseICalendarDateTimeUTC() {
68*a1a3b679SAndreas Boehler
69*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parseDateTime('20100316T141405Z');
70*a1a3b679SAndreas Boehler
71*a1a3b679SAndreas Boehler        $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC'));
72*a1a3b679SAndreas Boehler        $this->assertEquals($compare, $dateTime);
73*a1a3b679SAndreas Boehler
74*a1a3b679SAndreas Boehler    }
75*a1a3b679SAndreas Boehler
76*a1a3b679SAndreas Boehler    /**
77*a1a3b679SAndreas Boehler     * @depends testParseICalendarDateTime
78*a1a3b679SAndreas Boehler     */
79*a1a3b679SAndreas Boehler    function testParseICalendarDateTimeUTC2() {
80*a1a3b679SAndreas Boehler
81*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parseDateTime('20101211T160000Z');
82*a1a3b679SAndreas Boehler
83*a1a3b679SAndreas Boehler        $compare = new DateTime('2010-12-11 16:00:00',new DateTimeZone('UTC'));
84*a1a3b679SAndreas Boehler        $this->assertEquals($compare, $dateTime);
85*a1a3b679SAndreas Boehler
86*a1a3b679SAndreas Boehler    }
87*a1a3b679SAndreas Boehler
88*a1a3b679SAndreas Boehler    /**
89*a1a3b679SAndreas Boehler     * @depends testParseICalendarDateTime
90*a1a3b679SAndreas Boehler     */
91*a1a3b679SAndreas Boehler    function testParseICalendarDateTimeCustomTimeZone() {
92*a1a3b679SAndreas Boehler
93*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parseDateTime('20100316T141405', new DateTimeZone('Europe/Amsterdam'));
94*a1a3b679SAndreas Boehler
95*a1a3b679SAndreas Boehler        $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('Europe/Amsterdam'));
96*a1a3b679SAndreas Boehler        $this->assertEquals($compare, $dateTime);
97*a1a3b679SAndreas Boehler
98*a1a3b679SAndreas Boehler    }
99*a1a3b679SAndreas Boehler
100*a1a3b679SAndreas Boehler    function testParseICalendarDate() {
101*a1a3b679SAndreas Boehler
102*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parseDate('20100316');
103*a1a3b679SAndreas Boehler
104*a1a3b679SAndreas Boehler        $expected = new DateTime('2010-03-16 00:00:00',new DateTimeZone('UTC'));
105*a1a3b679SAndreas Boehler
106*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $dateTime);
107*a1a3b679SAndreas Boehler
108*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parse('20100316');
109*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $dateTime);
110*a1a3b679SAndreas Boehler
111*a1a3b679SAndreas Boehler    }
112*a1a3b679SAndreas Boehler
113*a1a3b679SAndreas Boehler    /**
114*a1a3b679SAndreas Boehler     * TCheck if a date with year > 4000 will not throw an exception. iOS seems to use 45001231 in yearly recurring events
115*a1a3b679SAndreas Boehler     */
116*a1a3b679SAndreas Boehler    function testParseICalendarDateGreaterThan4000() {
117*a1a3b679SAndreas Boehler
118*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parseDate('45001231');
119*a1a3b679SAndreas Boehler
120*a1a3b679SAndreas Boehler        $expected = new DateTime('4500-12-31 00:00:00',new DateTimeZone('UTC'));
121*a1a3b679SAndreas Boehler
122*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $dateTime);
123*a1a3b679SAndreas Boehler
124*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parse('45001231');
125*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $dateTime);
126*a1a3b679SAndreas Boehler
127*a1a3b679SAndreas Boehler    }
128*a1a3b679SAndreas Boehler
129*a1a3b679SAndreas Boehler    /**
130*a1a3b679SAndreas Boehler     * Check if a datetime with year > 4000 will not throw an exception. iOS seems to use 45001231T235959 in yearly recurring events
131*a1a3b679SAndreas Boehler     */
132*a1a3b679SAndreas Boehler    function testParseICalendarDateTimeGreaterThan4000() {
133*a1a3b679SAndreas Boehler
134*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parseDateTime('45001231T235959');
135*a1a3b679SAndreas Boehler
136*a1a3b679SAndreas Boehler        $expected = new DateTime('4500-12-31 23:59:59',new DateTimeZone('UTC'));
137*a1a3b679SAndreas Boehler
138*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $dateTime);
139*a1a3b679SAndreas Boehler
140*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parse('45001231T235959');
141*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $dateTime);
142*a1a3b679SAndreas Boehler
143*a1a3b679SAndreas Boehler    }
144*a1a3b679SAndreas Boehler
145*a1a3b679SAndreas Boehler    /**
146*a1a3b679SAndreas Boehler     * @depends testParseICalendarDate
147*a1a3b679SAndreas Boehler     * @expectedException LogicException
148*a1a3b679SAndreas Boehler     */
149*a1a3b679SAndreas Boehler    function testParseICalendarDateBadFormat() {
150*a1a3b679SAndreas Boehler
151*a1a3b679SAndreas Boehler        $dateTime = DateTimeParser::parseDate('20100316T141405');
152*a1a3b679SAndreas Boehler
153*a1a3b679SAndreas Boehler    }
154*a1a3b679SAndreas Boehler
155*a1a3b679SAndreas Boehler    /**
156*a1a3b679SAndreas Boehler     * @dataProvider vcardDates
157*a1a3b679SAndreas Boehler     */
158*a1a3b679SAndreas Boehler    function testVCardDate($input, $output) {
159*a1a3b679SAndreas Boehler
160*a1a3b679SAndreas Boehler        $this->assertEquals(
161*a1a3b679SAndreas Boehler            $output,
162*a1a3b679SAndreas Boehler            DateTimeParser::parseVCardDateTime($input)
163*a1a3b679SAndreas Boehler        );
164*a1a3b679SAndreas Boehler
165*a1a3b679SAndreas Boehler    }
166*a1a3b679SAndreas Boehler
167*a1a3b679SAndreas Boehler    /**
168*a1a3b679SAndreas Boehler     * @dataProvider vcardDates
169*a1a3b679SAndreas Boehler     * @expectedException \InvalidArgumentException
170*a1a3b679SAndreas Boehler     */
171*a1a3b679SAndreas Boehler    function testBadVCardDate() {
172*a1a3b679SAndreas Boehler
173*a1a3b679SAndreas Boehler        DateTimeParser::parseVCardDateTime('1985---01');
174*a1a3b679SAndreas Boehler
175*a1a3b679SAndreas Boehler    }
176*a1a3b679SAndreas Boehler
177*a1a3b679SAndreas Boehler    /**
178*a1a3b679SAndreas Boehler     * @dataProvider vcardDates
179*a1a3b679SAndreas Boehler     * @expectedException \InvalidArgumentException
180*a1a3b679SAndreas Boehler     */
181*a1a3b679SAndreas Boehler    function testBadVCardTime() {
182*a1a3b679SAndreas Boehler
183*a1a3b679SAndreas Boehler        DateTimeParser::parseVCardTime('23:12:166');
184*a1a3b679SAndreas Boehler
185*a1a3b679SAndreas Boehler    }
186*a1a3b679SAndreas Boehler
187*a1a3b679SAndreas Boehler    function vcardDates() {
188*a1a3b679SAndreas Boehler
189*a1a3b679SAndreas Boehler        return array(
190*a1a3b679SAndreas Boehler            array(
191*a1a3b679SAndreas Boehler                "19961022T140000",
192*a1a3b679SAndreas Boehler                array(
193*a1a3b679SAndreas Boehler                    "year" => 1996,
194*a1a3b679SAndreas Boehler                    "month" => 10,
195*a1a3b679SAndreas Boehler                    "date" => 22,
196*a1a3b679SAndreas Boehler                    "hour" => 14,
197*a1a3b679SAndreas Boehler                    "minute" => 00,
198*a1a3b679SAndreas Boehler                    "second" => 00,
199*a1a3b679SAndreas Boehler                    "timezone" => null
200*a1a3b679SAndreas Boehler                ),
201*a1a3b679SAndreas Boehler            ),
202*a1a3b679SAndreas Boehler            array(
203*a1a3b679SAndreas Boehler                "--1022T1400",
204*a1a3b679SAndreas Boehler                array(
205*a1a3b679SAndreas Boehler                    "year" => null,
206*a1a3b679SAndreas Boehler                    "month" => 10,
207*a1a3b679SAndreas Boehler                    "date" => 22,
208*a1a3b679SAndreas Boehler                    "hour" => 14,
209*a1a3b679SAndreas Boehler                    "minute" => 00,
210*a1a3b679SAndreas Boehler                    "second" => null,
211*a1a3b679SAndreas Boehler                    "timezone" => null
212*a1a3b679SAndreas Boehler                ),
213*a1a3b679SAndreas Boehler            ),
214*a1a3b679SAndreas Boehler            array(
215*a1a3b679SAndreas Boehler                "---22T14",
216*a1a3b679SAndreas Boehler                array(
217*a1a3b679SAndreas Boehler                    "year" => null,
218*a1a3b679SAndreas Boehler                    "month" => null,
219*a1a3b679SAndreas Boehler                    "date" => 22,
220*a1a3b679SAndreas Boehler                    "hour" => 14,
221*a1a3b679SAndreas Boehler                    "minute" => null,
222*a1a3b679SAndreas Boehler                    "second" => null,
223*a1a3b679SAndreas Boehler                    "timezone" => null
224*a1a3b679SAndreas Boehler                ),
225*a1a3b679SAndreas Boehler            ),
226*a1a3b679SAndreas Boehler            array(
227*a1a3b679SAndreas Boehler                "19850412",
228*a1a3b679SAndreas Boehler                array(
229*a1a3b679SAndreas Boehler                    "year" => 1985,
230*a1a3b679SAndreas Boehler                    "month" => 4,
231*a1a3b679SAndreas Boehler                    "date" => 12,
232*a1a3b679SAndreas Boehler                    "hour" => null,
233*a1a3b679SAndreas Boehler                    "minute" => null,
234*a1a3b679SAndreas Boehler                    "second" => null,
235*a1a3b679SAndreas Boehler                    "timezone" => null
236*a1a3b679SAndreas Boehler                ),
237*a1a3b679SAndreas Boehler            ),
238*a1a3b679SAndreas Boehler            array(
239*a1a3b679SAndreas Boehler                "1985-04",
240*a1a3b679SAndreas Boehler                array(
241*a1a3b679SAndreas Boehler                    "year" => 1985,
242*a1a3b679SAndreas Boehler                    "month" => 04,
243*a1a3b679SAndreas Boehler                    "date" => null,
244*a1a3b679SAndreas Boehler                    "hour" => null,
245*a1a3b679SAndreas Boehler                    "minute" => null,
246*a1a3b679SAndreas Boehler                    "second" => null,
247*a1a3b679SAndreas Boehler                    "timezone" => null
248*a1a3b679SAndreas Boehler                ),
249*a1a3b679SAndreas Boehler            ),
250*a1a3b679SAndreas Boehler            array(
251*a1a3b679SAndreas Boehler                "1985",
252*a1a3b679SAndreas Boehler                array(
253*a1a3b679SAndreas Boehler                    "year" => 1985,
254*a1a3b679SAndreas Boehler                    "month" => null,
255*a1a3b679SAndreas Boehler                    "date" => null,
256*a1a3b679SAndreas Boehler                    "hour" => null,
257*a1a3b679SAndreas Boehler                    "minute" => null,
258*a1a3b679SAndreas Boehler                    "second" => null,
259*a1a3b679SAndreas Boehler                    "timezone" => null
260*a1a3b679SAndreas Boehler                ),
261*a1a3b679SAndreas Boehler            ),
262*a1a3b679SAndreas Boehler            array(
263*a1a3b679SAndreas Boehler                "--0412",
264*a1a3b679SAndreas Boehler                array(
265*a1a3b679SAndreas Boehler                    "year" => null,
266*a1a3b679SAndreas Boehler                    "month" => 4,
267*a1a3b679SAndreas Boehler                    "date" => 12,
268*a1a3b679SAndreas Boehler                    "hour" => null,
269*a1a3b679SAndreas Boehler                    "minute" => null,
270*a1a3b679SAndreas Boehler                    "second" => null,
271*a1a3b679SAndreas Boehler                    "timezone" => null
272*a1a3b679SAndreas Boehler                ),
273*a1a3b679SAndreas Boehler            ),
274*a1a3b679SAndreas Boehler            array(
275*a1a3b679SAndreas Boehler                "---12",
276*a1a3b679SAndreas Boehler                array(
277*a1a3b679SAndreas Boehler                    "year" => null,
278*a1a3b679SAndreas Boehler                    "month" => null,
279*a1a3b679SAndreas Boehler                    "date" => 12,
280*a1a3b679SAndreas Boehler                    "hour" => null,
281*a1a3b679SAndreas Boehler                    "minute" => null,
282*a1a3b679SAndreas Boehler                    "second" => null,
283*a1a3b679SAndreas Boehler                    "timezone" => null
284*a1a3b679SAndreas Boehler                ),
285*a1a3b679SAndreas Boehler            ),
286*a1a3b679SAndreas Boehler            array(
287*a1a3b679SAndreas Boehler                "T102200",
288*a1a3b679SAndreas Boehler                array(
289*a1a3b679SAndreas Boehler                    "year" => null,
290*a1a3b679SAndreas Boehler                    "month" => null,
291*a1a3b679SAndreas Boehler                    "date" => null,
292*a1a3b679SAndreas Boehler                    "hour" => 10,
293*a1a3b679SAndreas Boehler                    "minute" => 22,
294*a1a3b679SAndreas Boehler                    "second" => 0,
295*a1a3b679SAndreas Boehler                    "timezone" => null
296*a1a3b679SAndreas Boehler                ),
297*a1a3b679SAndreas Boehler            ),
298*a1a3b679SAndreas Boehler            array(
299*a1a3b679SAndreas Boehler                "T1022",
300*a1a3b679SAndreas Boehler                array(
301*a1a3b679SAndreas Boehler                    "year" => null,
302*a1a3b679SAndreas Boehler                    "month" => null,
303*a1a3b679SAndreas Boehler                    "date" => null,
304*a1a3b679SAndreas Boehler                    "hour" => 10,
305*a1a3b679SAndreas Boehler                    "minute" => 22,
306*a1a3b679SAndreas Boehler                    "second" => null,
307*a1a3b679SAndreas Boehler                    "timezone" => null
308*a1a3b679SAndreas Boehler                ),
309*a1a3b679SAndreas Boehler            ),
310*a1a3b679SAndreas Boehler            array(
311*a1a3b679SAndreas Boehler                "T10",
312*a1a3b679SAndreas Boehler                array(
313*a1a3b679SAndreas Boehler                    "year" => null,
314*a1a3b679SAndreas Boehler                    "month" => null,
315*a1a3b679SAndreas Boehler                    "date" => null,
316*a1a3b679SAndreas Boehler                    "hour" => 10,
317*a1a3b679SAndreas Boehler                    "minute" => null,
318*a1a3b679SAndreas Boehler                    "second" => null,
319*a1a3b679SAndreas Boehler                    "timezone" => null
320*a1a3b679SAndreas Boehler                ),
321*a1a3b679SAndreas Boehler            ),
322*a1a3b679SAndreas Boehler            array(
323*a1a3b679SAndreas Boehler                "T-2200",
324*a1a3b679SAndreas Boehler                array(
325*a1a3b679SAndreas Boehler                    "year" => null,
326*a1a3b679SAndreas Boehler                    "month" => null,
327*a1a3b679SAndreas Boehler                    "date" => null,
328*a1a3b679SAndreas Boehler                    "hour" => null,
329*a1a3b679SAndreas Boehler                    "minute" => 22,
330*a1a3b679SAndreas Boehler                    "second" => 00,
331*a1a3b679SAndreas Boehler                    "timezone" => null
332*a1a3b679SAndreas Boehler                ),
333*a1a3b679SAndreas Boehler            ),
334*a1a3b679SAndreas Boehler            array(
335*a1a3b679SAndreas Boehler                "T--00",
336*a1a3b679SAndreas Boehler                array(
337*a1a3b679SAndreas Boehler                    "year" => null,
338*a1a3b679SAndreas Boehler                    "month" => null,
339*a1a3b679SAndreas Boehler                    "date" => null,
340*a1a3b679SAndreas Boehler                    "hour" => null,
341*a1a3b679SAndreas Boehler                    "minute" => null,
342*a1a3b679SAndreas Boehler                    "second" => 00,
343*a1a3b679SAndreas Boehler                    "timezone" => null
344*a1a3b679SAndreas Boehler                ),
345*a1a3b679SAndreas Boehler            ),
346*a1a3b679SAndreas Boehler            array(
347*a1a3b679SAndreas Boehler                "T102200Z",
348*a1a3b679SAndreas Boehler                array(
349*a1a3b679SAndreas Boehler                    "year" => null,
350*a1a3b679SAndreas Boehler                    "month" => null,
351*a1a3b679SAndreas Boehler                    "date" => null,
352*a1a3b679SAndreas Boehler                    "hour" => 10,
353*a1a3b679SAndreas Boehler                    "minute" => 22,
354*a1a3b679SAndreas Boehler                    "second" => 00,
355*a1a3b679SAndreas Boehler                    "timezone" => 'Z'
356*a1a3b679SAndreas Boehler                ),
357*a1a3b679SAndreas Boehler            ),
358*a1a3b679SAndreas Boehler            array(
359*a1a3b679SAndreas Boehler                "T102200-0800",
360*a1a3b679SAndreas Boehler                array(
361*a1a3b679SAndreas Boehler                    "year" => null,
362*a1a3b679SAndreas Boehler                    "month" => null,
363*a1a3b679SAndreas Boehler                    "date" => null,
364*a1a3b679SAndreas Boehler                    "hour" => 10,
365*a1a3b679SAndreas Boehler                    "minute" => 22,
366*a1a3b679SAndreas Boehler                    "second" => 00,
367*a1a3b679SAndreas Boehler                    "timezone" => '-0800'
368*a1a3b679SAndreas Boehler                ),
369*a1a3b679SAndreas Boehler            ),
370*a1a3b679SAndreas Boehler
371*a1a3b679SAndreas Boehler            // extended format
372*a1a3b679SAndreas Boehler            array(
373*a1a3b679SAndreas Boehler                "2012-11-29T15:10:53Z",
374*a1a3b679SAndreas Boehler                array(
375*a1a3b679SAndreas Boehler                    "year" => 2012,
376*a1a3b679SAndreas Boehler                    "month" => 11,
377*a1a3b679SAndreas Boehler                    "date" => 29,
378*a1a3b679SAndreas Boehler                    "hour" => 15,
379*a1a3b679SAndreas Boehler                    "minute" => 10,
380*a1a3b679SAndreas Boehler                    "second" => 53,
381*a1a3b679SAndreas Boehler                    "timezone" => 'Z'
382*a1a3b679SAndreas Boehler                ),
383*a1a3b679SAndreas Boehler            ),
384*a1a3b679SAndreas Boehler
385*a1a3b679SAndreas Boehler            // with milliseconds
386*a1a3b679SAndreas Boehler            array(
387*a1a3b679SAndreas Boehler                "20121129T151053.123Z",
388*a1a3b679SAndreas Boehler                array(
389*a1a3b679SAndreas Boehler                    "year" => 2012,
390*a1a3b679SAndreas Boehler                    "month" => 11,
391*a1a3b679SAndreas Boehler                    "date" => 29,
392*a1a3b679SAndreas Boehler                    "hour" => 15,
393*a1a3b679SAndreas Boehler                    "minute" => 10,
394*a1a3b679SAndreas Boehler                    "second" => 53,
395*a1a3b679SAndreas Boehler                    "timezone" => 'Z'
396*a1a3b679SAndreas Boehler                ),
397*a1a3b679SAndreas Boehler            ),
398*a1a3b679SAndreas Boehler
399*a1a3b679SAndreas Boehler            // extended format with milliseconds
400*a1a3b679SAndreas Boehler            array(
401*a1a3b679SAndreas Boehler                "2012-11-29T15:10:53.123Z",
402*a1a3b679SAndreas Boehler                array(
403*a1a3b679SAndreas Boehler                    "year" => 2012,
404*a1a3b679SAndreas Boehler                    "month" => 11,
405*a1a3b679SAndreas Boehler                    "date" => 29,
406*a1a3b679SAndreas Boehler                    "hour" => 15,
407*a1a3b679SAndreas Boehler                    "minute" => 10,
408*a1a3b679SAndreas Boehler                    "second" => 53,
409*a1a3b679SAndreas Boehler                    "timezone" => 'Z'
410*a1a3b679SAndreas Boehler                ),
411*a1a3b679SAndreas Boehler            ),
412*a1a3b679SAndreas Boehler
413*a1a3b679SAndreas Boehler        );
414*a1a3b679SAndreas Boehler
415*a1a3b679SAndreas Boehler    }
416*a1a3b679SAndreas Boehler
417*a1a3b679SAndreas Boehler}
418