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